正确地“加入”两个交叉申请

时间:2019-08-22 10:33:22

标签: sql sql-server cross-apply

我有一个包含三个交叉应用程序的查询,这些查询从三个不同的表中收集数据。第一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。 任何帮助都不胜感激:)

1 个答案:

答案 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;
相关问题