Sql-Server

從 SQL 連結表中的條件聚合行

  • March 10, 2021

我無法解決給我這些結果的查詢

我有一張表,可以讓我每天使用設備。

dbo.DailyUses

Uses |   Date   |  Device
3    | 2020-3-1 |    A2
5    | 2020-3-1 |    B3
1    | 2020-3-2 |    A2
12   | 2020-3-3 |    C4

我有另一個表給了我每個設備可能的錯誤程式碼。

dbo.Code_SKU_Combos

ErrorCode |  Device
  12.24  |    A2
  12.25  |    A2
  12.26  |    A2
  12.24  |    B3
  12.26  |    B3
  12.25  |    C4

有了這兩個表,我想知道每個“錯誤程式碼電纜設備”每天使用多少次

範例輸出

Uses |   Date   |  ErrorCode
8    | 2020-3-1 |    12.24
3    | 2020-3-1 |    12.25
8    | 2020-3-1 |    12.26
5    | 2020-3-2 |    12.24
5    | 2020-3-2 |    12.25
5    | 2020-3-2 |    12.26
0    | 2020-3-3 |    12.24
12   | 2020-3-3 |    12.25
0    | 2020-3-3 |    12.26 

我正在考慮使用視窗函式或連接,但是這兩個表將使用重複值這一事實讓我在創建分區和分組依據時感到困惑。我覺得我想多了。

我創建了我的日期範圍和錯誤程式碼的交叉表,現在我只需要創建一個 SUM() 函式,它基於從 dbo.Code_Sku_Combos 創建的過濾器查看 dbo.DailyUses

我也在使用 Microsoft SQL

一個可能的解決方案是:

第一個選擇獲取表中存在的日期和錯誤組合的所有組合。

如果您確實想要所有可能的日期,則需要添加另一個創建的表,其中包含所有可能的日期

CREATE TABLE Code_SKU_Combos
    ([ErrorCode] varchar(5), [Device] varchar(2))
;
    
INSERT INTO Code_SKU_Combos
    ([ErrorCode], [Device])
VALUES
    ('12.24', 'A2'),
    ('12.25', 'A2'),
    ('12.26', 'A2'),
    ('12.24', 'B3'),
    ('12.26', 'B3'),
    ('12.25', 'C4')
;
GO
CREATE TABLE DailyUses
    ([Uses] int, [Date] Date, [Device] varchar(2))
;
    
INSERT INTO DailyUses
    ([Uses], [Date], [Device])
VALUES
    (3, '2020-3-1', 'A2'),
    (5, '2020-3-1', 'B3'),
    (1, '2020-3-2', 'A2'),
    (12, '2020-3-3', 'C4')
;
GO
SELECT DISTINCT [Date],[ErrorCode] FROM DailyUses CROSS JOIN  Code_SKU_Combos
GO
日期 | 錯誤程式碼
:--------- | :--------
2020-03-01 | 12.24 
2020-03-01 | 12.25 
2020-03-01 | 12.26 
2020-03-02 | 12.24 
2020-03-02 | 12.25 
2020-03-02 | 12.26 
2020-03-03 | 12.24 
2020-03-03 | 12.25 
2020-03-03 | 12.26 
SELECT ISNULL (SUM([Uses]),0) AS Uses, DateComp as [Date],[errorcomp] AS ErrorCode
FROM (SELECT DISTINCT [Date] as DateComp,[ErrorCode] AS errorcomp FROM DailyUses CROSS JOIN  Code_SKU_Combos) t1
LEFT JOIN (
DailyUses d INNER JOIN Code_SKU_Combos c ON d.[Device] = c.[Device]) ON t1.DateComp = d.[Date] 
AND  t1.errorcomp = c.[ErrorCode]

GROUP BY [DateComp],[errorcomp]
ORDER BY [DateComp],[errorcomp]
GO
用途 | 日期 | 錯誤程式碼
---: | :--------- | :--------
 8 | 2020-03-01 | 12.24 
 3 | 2020-03-01 | 12.25 
 8 | 2020-03-01 | 12.26 
 1 | 2020-03-02 | 12.24 
 1 | 2020-03-02 | 12.25 
 1 | 2020-03-02 | 12.26 
 0 | 2020-03-03 | 12.24 
 12 | 2020-03-03 | 12.25 
 0 | 2020-03-03 | 12.26 

db<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/286816