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
}
}
Вы можете использовать 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
Это будет работать даже в ситуации, когда у вас есть выход для продукта, но нет вход. Это может произойти, когда данные касаются транзакций, скажем, одного месяца, но там, где в начале этого месяца уже есть запас.
Добро пожаловать в 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 |
Я бы делал агрегацию в подзапросах и присоединялся к ним.
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;
Я думаю, что 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
.