我有一个包含三个交叉应用程序的查询,这些查询从三个不同的表中收集数据。第一Cr-Ap辅助第二和第三Cr-Ap。它找到某个“笔芯”笔芯的最新ID,ID越高,笔芯越新。
第二次和第三次Cr-Ap收集最近一次重新装满的物品和已经配送的物品的SUMS。
如果我分别运行Cr-Ap 2或3的查询,输出将类似于:
ID Amount
1 100
2 1000
3 100
4 0
5 0
etc
金额将是已分配或重新填充的物品的数量。
只有我不想单独运行这些查询,我希望它们彼此相邻。 所以我想要的是一个看起来像这样的表:
ID Refill Dispense
1 100 1
2 1000 5
3 100 7
4 0 99
5 0 3
etc
我的肠子告诉我要做
INNER JOIN crossaply2 ON crossapply3.ID = crossapply2.ID
但这不起作用。我对SQL还是很陌生,所以我不完全知道我可以和不能加入什么,我知道您可以将crossapply用作联接(sorta?)。我想这可能是我在这里需要做的,我只是不知道该怎么做。
但是不是那样,还有另一个复杂之处,就是某些笔芯不会分配任何东西。在这些情况下,我为分配编写的交叉应用程序不会为该refillID返回任何内容。什么也不是,我不是说NULL,而是跳过refillID。但我希望在这种情况下看到0。因为它只是跳过那些ID,所以我无法使COALESCE或ISNULL起作用,这也可能会使这两个应用程序的合并变得复杂。因为INNER JOIN会跳过没有分配量的任何行,即使有一个我希望看到的重新填充量也是如此。 这是我的代码:
-- Dispensed SUM and Refilled SUM combined
SELECT [CartridgeRefill].[FK_CartridgeRegistration_Id]
,Refills.Refilled
,Dispenses.Dispensed
FROM [CartridgeRefill]
CROSS APPLY(
SELECT MAX([CartridgeRefill].[Id]) AS RecentRefillID
FROM [CartridgeRefill]
GROUP BY [CartridgeRefill].[FK_CartridgeRegistration_Id]
) AS RecentRefill
CROSS APPLY(
SELECT [CartridgeRefill].[FK_CartridgeRegistration_Id] AS RefilledID
,SUM([CartridgeRefillMedication].[Amount]) AS Refilled
FROM [CartridgeRefillMedication]
INNER JOIN [CartridgeRefill] ON [CartridgeRefillMedication].[FK_CartridgeRefill_Id] = [CartridgeRefill].[Id]
WHERE [CartridgeRefillMedication].[FK_CartridgeRefill_Id] = RecentRefill.RecentRefillID
GROUP BY [CartridgeRefill].[FK_CartridgeRegistration_Id]
) AS Refills
CROSS APPLY(
SELECT [CartridgeRefill].[FK_CartridgeRegistration_Id] AS DispensedID
,SUM([CartridgeDispenseAttempt].[Amount]) AS Dispensed
FROM [CartridgeDispenseAttempt]
INNER JOIN [CartridgeRefill] ON [CartridgeDispenseAttempt].[FK_CartridgeRefill_Id] = [CartridgeRefill].[Id]
WHERE [CartridgeDispenseAttempt].[FK_CartridgeRefill_Id] = RecentRefill.RecentRefillID
GROUP BY [CartridgeRefill].[FK_CartridgeRegistration_Id]
) AS Dispenses
GO
此代码的输出如下:
1 300 1
1 300 1
1 200 194
1 200 194
1 200 8
1 200 8
1 0 39
1 0 39
1 100 14
1 100 14
1 200 1
1 200 1
1 0 28
1 0 28
1 1000 102
1 1000 102
1 1000 557
1 1000 557
1 2000 92
1 2000 92
1 100 75
1 100 75
1 100 100
1 100 100
1 100 51
1 100 51
1 600 28
1 600 28
1 200 47
1 200 47
1 200 152
1 200 152
1 234 26
1 234 26
1 0 227
1 0 227
1 10 6
1 10 6
1 300 86
1 300 86
1 0 194
1 0 194
1 500 18
1 500 18
1 1000 51
1 1000 51
1 1000 56
1 1000 56
1 500 48
1 500 48
1 0 10
1 0 10
1 1500 111
1 1500 111
1 56 79
1 56 79
1 100 6
1 100 6
1 44 134
1 44 134
1 1000 488
1 1000 488
1 100 32
1 100 32
1 100 178
1 100 178
1 500 672
1 500 672
1 200 26
1 200 26
1 500 373
1 500 373
1 100 10
1 100 10
1 900 28
1 900 28
2 900 28
2 900 28
2 900 28
etc
这完全是胡说,我做不了什么,它持续了大约2万行,并最终遍历了所有ID。 任何帮助都不胜感激:)
答案 0 :(得分:1)
看起来有点复杂。 试试
WITH cr AS (
SELECT [FK_CartridgeRegistration_Id]
,MAX([CartridgeRefill].[Id]) RecentRefillID
FROM [CartridgeRefill]
GROUP BY [FK_CartridgeRegistration_Id]
)
SELECT cr.[FK_CartridgeRegistration_Id], Refills.Refilled, Dispenses.Dispensed
FROM cr
CROSS APPLY(
SELECT SUM(crm.[Amount]) AS Refilled
FROM [CartridgeRefillMedication] crm
WHERE crm.[FK_CartridgeRefill_Id] = cr.RecentRefillID
) AS Refills
CROSS APPLY(
SELECT SUM(cda.[Amount]) AS Dispensed
FROM [CartridgeDispenseAttempt] cda
WHERE cda.[FK_CartridgeRefill_Id] = cr.RecentRefillID
) AS Dispenses;