ЛЕВЫЕ СОЕДИНЕНИЯ двух таблиц, СУММА, ГРУППА

Sub class UINavigationController и использовать переход CoreAnimation's для изменения анимации push / pop.

enum TransitionType {
    case fade
    case movein
    case push
    case reveal
}
enum TransitionSubtype {
    case right
    case left
    case top
    case bottom
}

class MyNavigationController: UINavigationController {

    fileprivate func getTransition(by type: TransitionType) -> String? {
        var transition: String?
        switch type {
        case .fade:
            transition = kCATransitionFade
            break
        case .push:
            transition = kCATransitionPush
            break
        case .movein:
            transition = kCATransitionMoveIn
            break
        case .reveal:
            transition = kCATransitionReveal
            break
        default:
            transition = nil
            break
        }
        return transition
    }
    fileprivate func getSubTransition(by type: TransitionSubtype) -> String? {
        var transition: String?
        switch type {
        case .right:
            transition = kCATransitionFromRight
            break
        case .left:
            transition = kCATransitionFromLeft
            break
        case .top:
            transition = kCATransitionFromTop
            break
        case .bottom:
            transition = kCATransitionFromBottom
            break
        default:
            transition = nil
            break
        }
        return transition
    }

    func display(viewController: UIViewController, animated: Bool, animationType: TransitionType = .push, animationSubtype: TransitionSubtype = .left) -> Bool {
        guard  let type = getTransition(by: animationType) else {return false}
        guard  let subtype = getSubTransition(by: animationSubtype) else {return false}
        if animated {
            let transition = CATransition()
            transition.duration = 0.35
            transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            transition.type = type
            transition.subtype = subtype
            self.view.layer.add(transition, forKey: nil)
        }
        _ = self.pushViewController(viewController, animated: false)
        return true
    }
    func hide(animated: Bool, animationType: TransitionType = .push, animationSubtype: TransitionSubtype = .left) -> Bool {
        guard  let type = getTransition(by: animationType) else {return false}
        guard  let subtype = getSubTransition(by: animationSubtype) else {return false}
        if animated {
            let transition = CATransition()
            transition.duration = 0.35
            transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            transition.type = type
            transition.subtype = subtype
            self.view.layer.add(transition, forKey: nil)
        }
        _ = self.popViewController(animated: false)
        return true
    }

}
1
задан sticky bit 19 January 2019 в 23:05
поделиться

4 ответа

Вы можете использовать union all:

SELECT  IF(sum(input) , productName, null) productName, sum(input) input,
        IF(sum(output), productName, null) productName, sum(output) output
FROM    (
            SELECT productName, QTY input, null output
            FROM input
            UNION ALL
            SELECT productName, null, QTY
            FROM output
        ) as sub
GROUP BY productName

sqlfiddle

Это будет работать даже в ситуации, когда у вас есть выход для продукта, но нет вход. Это может произойти, когда данные касаются транзакций, скажем, одного месяца, но там, где в начале этого месяца уже есть запас.

0
ответ дан trincot 19 January 2019 в 23:05
поделиться

Добро пожаловать в SO

Существует способ без подзапроса для достижения этой цели. Это математически:)

Поскольку вы работаете с двумя таблицами, вы получите результат, умноженный на идентификаторы, на продукт. Так что просто разделите сумму на количество продуктов, разделенное на уникальные идентификаторы, соответствующие этим продуктам:)

Так что-то вроде этого поможет: Схема (MySQL v5.7)

CREATE TABLE INPUT (
  `ID` INTEGER,
  `productName` VARCHAR(9),
  `QTY` INTEGER,
  `buyPrice` INTEGER,
  `sellPrice` INTEGER
);

INSERT INTO INPUT
  (`ID`, `productName`, `QTY`, `buyPrice`, `sellPrice`)
VALUES
  ('1', 'dress 007', '2', '700', '1400'),
  ('2', 'shirt 001', '4', '800', '1900'),
  ('3', 'dress 007', '10', '700', '1500'),
  ('4', 'dress 007', '6', '900', '2900'),
  ('5', 'shirt 001', '2', '750', '1600'),
  ('6', 'hat 008', '2', '300', '600');

CREATE TABLE OUTPUT (
  `ID` INTEGER,
  `productName` VARCHAR(9),
  `QTY` INTEGER
);

INSERT INTO OUTPUT
  (`ID`, `productName`, `QTY`)
VALUES
  ('1', 'dress 007', '4'),
  ('2', 'shirt 001', '2'),
  ('3', 'dress 007', '1'),
  ('4', 'dress 007', '1'),
  ('5', 'shirt 001', '3');

Запрос № 1

SELECT I.productName, 
       SUM(I.QTY)/(COUNT(I.productName)/count(distinct I.ID)) 
                                          as "SUM(QTY)INPUT",
       O.productName,                      
       SUM(O.QTY)/(COUNT(O.productName)/count(distinct O.ID))  
                                          as "SUM(QTY)OUTPUT"
FROM INPUT I
LEFT OUTER JOIN OUTPUT O ON I.productName = O.productName
GROUP BY I.productName
ORDER BY 2 DESC;

| productName | SUM(QTY)INPUT | SUM(QTY)OUTPUT | productName |
| ----------- | ------------- | -------------- | ----------- |
| dress 007   | 18            | 6              | dress 007   |
| shirt 001   | 6             | 5              | shirt 001   |
| hat 008     | 2             | null           | null        |

https://www.db-fiddle.com/f/ Dp7yaNkVf3JW2DZrrvL7G / 1

0
ответ дан Fabien TheSolution 19 January 2019 в 23:05
поделиться

Я бы делал агрегацию в подзапросах и присоединялся к ним.

SELECT input.productname,
       input.quantity input_quantity,
       output.quantity output_quantity
       FROM (SELECT productname,
                    sum(qty) quantity
                    FROM input
                    GROUP BY productname) input
            LEFT JOIN (SELECT productname,
                              sum(qty) quantity
                              FROM output
                              GROUP BY productname) output
                      ON output.productname = input.productname;
0
ответ дан sticky bit 19 January 2019 в 23:05
поделиться

Я думаю, что union all это путь. Я бы сделал:

select productName, sum(input) as input_qty, sum(output) as output_qty
from ((select productName, qty as input, null as output
       from input
      ) union all
      (select productName, null, qty
       from output
      )
     ) io
group by productName;

Обратите внимание, что productName появляется только один раз в наборе результатов. Я не вижу смысла включать его дважды. Если нет строки output (или нет input), то соответствующий qty будет NULL.

0
ответ дан Gordon Linoff 19 January 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: