SQL组合4个表,其中4列具有相同的数据和每个表中的1个唯一列

时间:2018-02-22 21:12:30

标签: mysql join multiple-columns

新手问题: 我有4个表有4个相似的数据列类型以及每个表独有的多个列。为了便于解释,每个查询只包含1个唯一列。

我想按MonthDate,Department,Category,Subcategory汇总数据,然后根据每个查询中的每个唯一列进行汇总。

对于Date,Department,Category,Subcategory,每个查询都会有一些组合,但没有一个会有所有组合。

我无法弄清楚如何正确和最佳地组合它们。

来自销售的查询

SELECT SalesDate, DeptCode, CatCode, SubCatCode, SUM(SalesUnits)
FROM SalesTable 
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, SalesDate), 0), DeptCode, CatCode, SubCatCode

╔══════╦══════╦══════╦══════╦══════╗
║ DATE ║ DPT  ║ CAT  ║ SUB  ║ SLS  ║
╠══════╬══════╬══════╬══════╬══════╣
║ 10/1 ║ 01   ║ 35   ║ 3548 ║ 11   ║
║ 11/1 ║ 01   ║ 35   ║ 3556 ║ 14   ║
╚══════╩══════╩══════╩══════╩══════╝

从购买表中查询

SELECT BuyDate, DeptCode, CatCode, SubCatCode, SUM(BuyUnits)
FROM BuyTable 
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, BuyDate), 0), DeptCode, CatCode, SubCatCode

╔══════╦══════╦══════╦══════╦══════╗
║ DATE ║ DPT  ║ CAT  ║ SUB  ║ BUY  ║
╠══════╬══════╬══════╬══════╬══════╣
║ 10/1 ║ 01   ║ 35   ║ 3548 ║ 17   ║
║ 11/1 ║ 01   ║ 35   ║ 3567 ║ 10   ║
╚══════╩══════╩══════╩══════╩══════╝

从调整表中查询

SELECT AdjustDate, DeptCode, CatCode, SubCatCode, SUM(AdjustmentUnits)
FROM AdjustmentTable 
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, AdjustDate), 0), DeptCode, CatCode, SubCatCode

╔══════╦══════╦══════╦══════╦══════╗
║ DATE ║ DPT  ║ CAT  ║ SUB  ║ ADJ  ║
╠══════╬══════╬══════╬══════╬══════╣
║ 10/1 ║ 01   ║ 35   ║ 3556 ║  5   ║
║ 11/1 ║ 01   ║ 35   ║ 3567 ║  3   ║
╚══════╩══════╩══════╩══════╩══════╝

从折扣表中查询

SELECT DiscountDate, DeptCode, CatCode, SubCatCode, SUM(DiscountAmount)
FROM DiscountTable 
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, DiscountDate), 0), DeptCode, CatCode, SubCatCode

╔══════╦══════╦══════╦══════╦══════╗
║ DATE ║ DPT  ║ CAT  ║ SUB  ║ DSC  ║
╠══════╬══════╬══════╬══════╬══════╣
║ 10/1 ║ 01   ║ 40   ║ 4014 ║  75  ║
║ 11/1 ║ 01   ║ 35   ║ 3567 ║  23  ║
╚══════╩══════╩══════╩══════╩══════╝

我希望总结如下:

╔══════╦══════╦══════╦══════╦══════╦══════╦══════╦══════╗
║ DATE ║ DPT  ║ CAT  ║ SUB  ║ SLS  ║ BUY  ║ ADJ  ║ DSC  ║
╠══════╬══════╬══════╬══════╬══════╬══════╬══════╬══════╣
║ 10/1 ║ 01   ║ 35   ║ 3548 ║ 11   ║ 17   ║ NULL ║ NULL ║
║ 10/1 ║ 01   ║ 35   ║ 3556 ║ NULL ║ NULL ║  5   ║ NULL ║
║ 10/1 ║ 01   ║ 40   ║ 4014 ║ NULL ║ NULL ║ NULL ║  75  ║
║ 11/1 ║ 01   ║ 35   ║ 3556 ║ 14   ║ NULL ║ NULL ║ NULL ║
║ 11/1 ║ 01   ║ 35   ║ 3567 ║ NULL ║ 10   ║  3   ║  23  ║
╚══════╩══════╩══════╩══════╩══════╩══════╩══════╩══════╝

这似乎对我有用:

SELECT COALESCE(T1.MDate, T2.MDate, T3.MDate, T4.MDate) MDate
, COALESCE(T1.Dept, T2.Dept, T3.Dept, T4.Dept) Dept
, COALESCE(T1.Cat, T2.Cat, T3.Cat, T4.Cat) Cat
, COALESCE(T1.Sub, T2.Sub, T3.Sub, T4.Sub) Sub
, SalesUnits, BuyUnits,  AdjustmentUnits,  DiscountAmount
FROM T1 FULL JOIN
T2 ON T2.MDate = T1.MDate AND T1.Dept = T2.Dept AND T1.Cat = T2.Cat AND T1.SubCat = T2.SubCat FULL JOIN
T3 ON T3.MDate = coalesce(T1.MDate, T2.MDate) AND T3.Dept = coalesce(T1.Dept, T2.Dept) AND T3.Cat = coalesce(T1.Cat, T2.Cat) AND T3.SubCat = coalesce(T1.SubCat, T2.SubCat) FULL JOIN
T4 ON T4.MDate = coalesce(T1.MDate, T2.MDate, T3.MDate) AND T4.Dept = coalesce(T1.Dept, T2.Dept, T3.Dept) AND T4.Cat = coalesce(T1.Cat, T2.Cat, T3.Cat) AND T4.SubCat = coalesce(T1.SubCat, T2.SubCat, T3.SubCat)

0 个答案:

没有答案