SSMS (SQL) 无法识别 CASE WHEN... 跳转到最后一个 ELSE 0
SSMS (SQL) Not recognizing CASE WHEN... jumps to last ELSE 0
例如,returns 订单号为 55,Calc_ORDER_NUMBER_LAG 为 55,Calc_Qty_Changed 列没有给我 2,即使它们是相等的。 ..
USE MfgMetrics
SELECT
[ORDER NUMBER],
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0)
OVER (Order By [ORDER NUMBER],[FileDate]),
--Order Number and File Date
[Order_Quantity],
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0)
OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] =
(CASE
WHEN [ORDER NUMBER] = [Calc_ORDER_NUMBER_LAG] THEN 2
WHEN [ORDER NUMBER] != [Calc_ORDER_NUMBER_LAG] AND
[Order_Quantity] != [Calc_Order_Quantity_LAG] AND
[ACTUAL START DATE] != 0 AND
[FileDate] >= [ACTUAL START DATE] THEN 1
ELSE 0
END)
FROM
dbo.Table_II
为什么每次都跳到ELSE 0,即使满足了其他CASE WHEN条件?
您应该 re-write 在 CASE 语句中使用 LAG() 函数。
create table table_II([ORDER NUMBER] int, [Order_Quantity] int, [FileDate] date);
insert into table_II values
(1, 10, '20180101'),
(2, 20, '20180102'),
(2, 30, '20180103');
GO
3 rows affected
SELECT
[ORDER NUMBER],
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate]),
[Order_Quantity],
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity]) OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] =
(CASE
WHEN [ORDER NUMBER] = LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate])
THEN 2
WHEN [ORDER NUMBER] != LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate])
AND [Order_Quantity] != LAG([Order_Quantity]) OVER (Order By [ORDER NUMBER], [FileDate])
--AND [ACTUAL START DATE] != 0
--AND [FileDate] >= [ACTUAL START DATE]
THEN 1
ELSE 0
END)
FROM
dbo.Table_II
GO
ORDER NUMBER | Calc_ORDER_NUMBER_LAG | Order_Quantity | Calc_Order_Quantity_LAG | Calc_Qty_Changed
-----------: | --------------------: | -------------: | ----------------------: | ---------------:
1 | null | 10 | null | 0
2 | 1 | 20 | 10 | 1
2 | 2 | 30 | 20 | 2
dbfiddle here
我猜,因为我不知道数据的样子,你应该这样做:
USE MfgMetrics
SELECT [ORDER NUMBER],
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]), --Order Number and File Date
[Order_Quantity],
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] = (CASE
WHEN [ORDER NUMBER]=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) THEN 2
WHEN [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate])
AND [Order_Quantity] != LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]) AND [ACTUAL START DATE] != 0 AND [FileDate] >= [ACTUAL START DATE]
THEN 1
ELSE 0 END)
FROM dbo.Table_II
例如,returns 订单号为 55,Calc_ORDER_NUMBER_LAG 为 55,Calc_Qty_Changed 列没有给我 2,即使它们是相等的。 ..
USE MfgMetrics
SELECT
[ORDER NUMBER],
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0)
OVER (Order By [ORDER NUMBER],[FileDate]),
--Order Number and File Date
[Order_Quantity],
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0)
OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] =
(CASE
WHEN [ORDER NUMBER] = [Calc_ORDER_NUMBER_LAG] THEN 2
WHEN [ORDER NUMBER] != [Calc_ORDER_NUMBER_LAG] AND
[Order_Quantity] != [Calc_Order_Quantity_LAG] AND
[ACTUAL START DATE] != 0 AND
[FileDate] >= [ACTUAL START DATE] THEN 1
ELSE 0
END)
FROM
dbo.Table_II
为什么每次都跳到ELSE 0,即使满足了其他CASE WHEN条件?
您应该 re-write 在 CASE 语句中使用 LAG() 函数。
create table table_II([ORDER NUMBER] int, [Order_Quantity] int, [FileDate] date); insert into table_II values (1, 10, '20180101'), (2, 20, '20180102'), (2, 30, '20180103'); GO
3 rows affected
SELECT [ORDER NUMBER], [Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate]), [Order_Quantity], [Calc_Order_Quantity_LAG] = LAG([Order_Quantity]) OVER (Order By [ORDER NUMBER], [FileDate]), [Calc_Qty_Changed] = (CASE WHEN [ORDER NUMBER] = LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate]) THEN 2 WHEN [ORDER NUMBER] != LAG([ORDER NUMBER]) OVER (Order By [ORDER NUMBER], [FileDate]) AND [Order_Quantity] != LAG([Order_Quantity]) OVER (Order By [ORDER NUMBER], [FileDate]) --AND [ACTUAL START DATE] != 0 --AND [FileDate] >= [ACTUAL START DATE] THEN 1 ELSE 0 END) FROM dbo.Table_II GO
ORDER NUMBER | Calc_ORDER_NUMBER_LAG | Order_Quantity | Calc_Order_Quantity_LAG | Calc_Qty_Changed -----------: | --------------------: | -------------: | ----------------------: | ---------------: 1 | null | 10 | null | 0 2 | 1 | 20 | 10 | 1 2 | 2 | 30 | 20 | 2
dbfiddle here
我猜,因为我不知道数据的样子,你应该这样做:
USE MfgMetrics
SELECT [ORDER NUMBER],
[Calc_ORDER_NUMBER_LAG] = LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]), --Order Number and File Date
[Order_Quantity],
[Calc_Order_Quantity_LAG] = LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]),
[Calc_Qty_Changed] = (CASE
WHEN [ORDER NUMBER]=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate]) THEN 2
WHEN [ORDER NUMBER]!=LAG([ORDER NUMBER],1,0) OVER (Order By [ORDER NUMBER],[FileDate])
AND [Order_Quantity] != LAG([Order_Quantity],1,0) OVER (Order By [ORDER NUMBER], [FileDate]) AND [ACTUAL START DATE] != 0 AND [FileDate] >= [ACTUAL START DATE]
THEN 1
ELSE 0 END)
FROM dbo.Table_II