我想在 SQL 服务器中使用 UNION 和 Group ignore 0 获取结果
I want to a get Result in SQL Server Using UNION and Group ignore 0
这是我的代码
DECLARE @Fromdate date = '2021-06-5';
DECLARE @Todate date = '2021-06-5';
DECLARE @till01 varchar(200) = 'ST-LO-01';
DECLARE @till02 varchar(200) = 'ST-LO-02';
DECLARE @till03 varchar(200) = 'ST-LO-03';
DECLARE @till04 varchar(200) = 'ST-LO-04';
DECLARE @till05 varchar(200) = 'ST-LO-05';
DECLARE @till06 varchar(200) = 'ST-LO-06';
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
ISNULL(COUNT(Srt.TRANSACTIONID), 0) AS Total_Inv,
0 AS Empty_Info
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
GROUP BY Srt.TRANSDATE,
Srt.TERMINAL
UNION
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
0 AS TOTAL,
ISNULL(COUNT(Srt.TRANSACTIONID), 0) AS EMPTY
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
AND Cinf.information IS NULL
GROUP BY Srt.TERMINAL,
Srt.TRANSDATE
ORDER BY Srt.TRANSDATE,
Srt.TERMINAL,
Empty_Info ASC;
结果是:
翻译
直到
Total_Inv
Empty_Info
2021-06-05
ST-LO-01
197
0
2021-06-05
ST-LO-01
0
2
2021-06-05
ST-LO-02
175
0
2021-06-05
ST-LO-02
0
4
2021-06-05
ST-LO-03
240
0
2021-06-05
ST-LO-03
0
9
2021-06-05
ST-LO-04
207
0
2021-06-05
ST-LO-04
0
9
我想要这个结果:
翻译
直到
Total_Inv
Empty_Info
2021-06-05
ST-LO-01
197
2
2021-06-05
ST-LO-02
175
4
2021-06-05
ST-LO-03
240
9
2021-06-05
ST-LO-04
207
9
看来您应该只使用一些条件聚合:
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
COUNT(Srt.TRANSACTIONID) AS Total_Inv, --Count can return 0 already, no need for the ISNULL
COUNT(CASE WHEN Cinf.information IS NULL THEN Srt.TRANSACTIONID END) AS Empty_Info
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
GROUP BY Srt.TRANSDATE,
Srt.TERMINAL;
这是我的代码
DECLARE @Fromdate date = '2021-06-5';
DECLARE @Todate date = '2021-06-5';
DECLARE @till01 varchar(200) = 'ST-LO-01';
DECLARE @till02 varchar(200) = 'ST-LO-02';
DECLARE @till03 varchar(200) = 'ST-LO-03';
DECLARE @till04 varchar(200) = 'ST-LO-04';
DECLARE @till05 varchar(200) = 'ST-LO-05';
DECLARE @till06 varchar(200) = 'ST-LO-06';
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
ISNULL(COUNT(Srt.TRANSACTIONID), 0) AS Total_Inv,
0 AS Empty_Info
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
GROUP BY Srt.TRANSDATE,
Srt.TERMINAL
UNION
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
0 AS TOTAL,
ISNULL(COUNT(Srt.TRANSACTIONID), 0) AS EMPTY
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
AND Cinf.information IS NULL
GROUP BY Srt.TERMINAL,
Srt.TRANSDATE
ORDER BY Srt.TRANSDATE,
Srt.TERMINAL,
Empty_Info ASC;
结果是:
翻译 | 直到 | Total_Inv | Empty_Info |
---|---|---|---|
2021-06-05 | ST-LO-01 | 197 | 0 |
2021-06-05 | ST-LO-01 | 0 | 2 |
2021-06-05 | ST-LO-02 | 175 | 0 |
2021-06-05 | ST-LO-02 | 0 | 4 |
2021-06-05 | ST-LO-03 | 240 | 0 |
2021-06-05 | ST-LO-03 | 0 | 9 |
2021-06-05 | ST-LO-04 | 207 | 0 |
2021-06-05 | ST-LO-04 | 0 | 9 |
我想要这个结果:
翻译 | 直到 | Total_Inv | Empty_Info |
---|---|---|---|
2021-06-05 | ST-LO-01 | 197 | 2 |
2021-06-05 | ST-LO-02 | 175 | 4 |
2021-06-05 | ST-LO-03 | 240 | 9 |
2021-06-05 | ST-LO-04 | 207 | 9 |
看来您应该只使用一些条件聚合:
SELECT Srt.TRANSDATE,
Srt.TERMINAL AS TILL,
COUNT(Srt.TRANSACTIONID) AS Total_Inv, --Count can return 0 already, no need for the ISNULL
COUNT(CASE WHEN Cinf.information IS NULL THEN Srt.TRANSACTIONID END) AS Empty_Info
FROM RETAILTRANSACTIONTABLE Srt
LEFT JOIN RetailTransactionInfoCodeTrans Cinf ON Cinf.TRANSACTIONID = Srt.TRANSACTIONID
WHERE Srt.TRANSDATE >= @Fromdate
AND Srt.TRANSDATE <= @Todate
AND Srt.TYPE = 2
AND Srt.TERMINAL IN (@till01, @till02, @till03, @till04)
GROUP BY Srt.TRANSDATE,
Srt.TERMINAL;