我有一個任務來求和,如果它與連接表不匹配,我想得到 sum value = 0。
SELECT
TCS.departement,
TCS.category,
FORMAT ( BE.DT , 'yyyy-MM' ) AS CURR_MONTH,
ISNULL(SUM(CASE
WHEN BE.DFROM IN('SEWING','WEAVING','FORMING',
'DYE','HSM','INSPECTION','WOVEN')
AND BE.DFROM = BE.DTO THEN BE.QTY
END
),0) AS TOTAL_LOSS_PROSES,
ISNULL(SUM(CASE
WHEN DFROM != 'SEWING' THEN QTY
WHEN DFROM != 'WEAVING'THEN QTY
WHEN DFROM != 'FORMING'THEN QTY
WHEN DFROM != 'DYE'THEN QTY
WHEN DFROM != 'HSM'THEN QTY
WHEN DFROM != 'INSPECTION'THEN QTY
WHEN DFROM != 'WOVEN'THEN QTY
ELSE 0
END),0) AS TOTAL_LOSS_SEMUA
FROM TBL_CATEGORY TCS
INNER JOIN
B_ENTRYLOSS BE ON TCS.category = BE.LOSSCAT
WHERE
FORMAT ( BE.DT , 'yyyy-MM') BETWEEN '2022-04' AND '2022-06'
GROUP BY TCS.departement, TCS.category,
FORMAT ( BE.DT , 'yyyy-MM')
order by category ASC, CURR_MONTH DESC;
我的結果:
|departement| category |CURR_MONTH|TOTAL_LOSS_PROSES|TOTAL_LOSS_SEMUA|
|:----------|:-------------|:---------|:----------------|:---------------|
|WEAVING | Anyaman | 2022-04 | 88.80 | 181.69 |
|WEAVING | Anyaman | 2022-05 | 86.64 | 126.02 |
|WEAVING | Anyaman | 2022-06 | 80.80 | 117.55 |
|DYE | Belang | 2022-04 | 0.00 | 0.67 |
|DYE | Belang | 2022-05 | 0.00 | 0.67 |
|WEAVING |Benang Keluar | 2022-05 | 24.11 | 24.11 |
|WEAVING |Benang Keluar | 2022-06 | 7.65 | 7.65 |
預期結果:
|departement| category |CURR_MONTH|TOTAL_LOSS_PROSES|TOTAL_LOSS_SEMUA|
|:----------|:-------------|:---------|:----------------|:---------------|
|WEAVING | Anyaman | 2022-04 | 88.80 | 181.69 |
|WEAVING | Anyaman | 2022-05 | 86.64 | 126.02 |
|WEAVING | Anyaman | 2022-06 | 80.80 | 117.55 |
|DYE | Belang | 2022-04 | 0.00 | 0.67 |
|DYE | Belang | 2022-05 | 0.00 | 0.67 |
|DYE | Belang | 2022-06 | 0.00 | 0.00 |
|WEAVING |Benang Keluar | 2022-04 | 0.00 | 0.00 |
|WEAVING |Benang Keluar | 2022-05 | 24.11 | 24.11 |
|WEAVING |Benang Keluar | 2022-06 | 7.65 | 7.65 |
請幫助我使用此代碼,我應該使用coalesce更改isnull嗎?
為什么我沒有使用單個運算式來求和,因為我使用查詢表單單個運算式得到的結果不匹配
SUM(CASE WHEN DFROM NOT IN( 'SEWING','WEAVING','FORMING','DYE','HSM','INSPECTION','WOVEN')
THEN QTY
ELSE 0
結果 :
|departement| category |CURR_MONTH|TOTAL_LOSS_PROSES|TOTAL_LOSS_SEMUA|
|:----------|:-------------|:---------|:----------------|:---------------|
|WEAVING | Anyaman | 2022-04 | 88.80 | 27.20
|WEAVING | Anyaman | 2022-05 | 86.64 | 22.87
|WEAVING | Anyaman | 2022-06 | 80.80 | 13.70
|DYE | Belang | 2022-04 | 0.00 | 0.67
|DYE | Belang | 2022-05 | 0.00 | 0.67
|WEAVING |Benang Keluar | 2022-05 | 24.11 | 0.00
|WEAVING |Benang Keluar | 2022-06 | 7.65 | 0.00
當我放置整個案例分支串列時,它與第一個查詢不同,我仍然不知道得到不同結果的原因
uj5u.com熱心網友回復:
如果內部連接表中沒有月份“2000-06”的資料,則該group by子句將不會產生任何行,因此使用ISNULLor無關緊要COALESCE(因為這兩個函式都沒有行跟...共事)。
因此,您必須“強制”每個想要的行存在,然后“外部連接”您的資料。您可以在下面看到我在“派生表”中形成了 3 個月的值,該表與cross join強制每個“月”出現在結果中的 a 一起使用。然后,這些“月份”將用作連接條件的一部分,以連接到您的損失源資料。現在,即使沒有匹配的源資料,您仍然會顯示月份。
SELECT
TCS.departement
, TCS.category
, m.mnth AS CURR_MONTH
, COALESCE(SUM(CASE
WHEN BE.DFROM IN ('SEWING', 'WEAVING', 'FORMING', 'DYE', 'HSM', 'INSPECTION', 'WOVEN') AND BE.DFROM = BE.DTO
THEN BE.QTY
END), 0) AS TOTAL_LOSS_PROSES
, COALESCE(SUM(CASE
WHEN BE.DFROM IN ('SEWING', 'WEAVING', 'FORMING', 'DYE', 'HSM', 'INSPECTION', 'WOVEN')
THEN 0
ELSE BE.QTY
END), 0) AS TOTAL_LOSS_SEMUA
FROM TBL_CATEGORY TCS
CROSS JOIN (
SELECT '2022-04' AS mnth
UNION ALL
SELECT '2022-05'
UNION ALL
SELECT '2022-06'
) AS m
LEFT OUTER JOIN B_ENTRYLOSS BE ON TCS.category = BE.LOSSCAT
AND FORMAT(BE.DT, 'yyyy-MM') = m.mnth
GROUP BY TCS.departement
, TCS.category
, m.mnth
ORDER BY category ASC
, CURR_MONTH DESC;
注意:我更喜歡使用(sql 標準)COALESCE而不是(屬性)ISNULL,我認為第二種情況運算式可以簡化為與第一種情況相似的結構,但如果為真則回傳 0,否則為 QTY。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494087.html
