Hum*_*All 6 sql-server t-sql group-by
我有以下查询:
SELECT DISTINCT
COUNT(CD_BarCode)
,CD_Carrier
,SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11) Date
FROM TB_AGIL
WHERE
DT_Arriving >= @date
AND DT_Arriving < DATEADD(MONTH,+1,@date)
AND CD_TRACKING = 14
GROUP BY CD_Carrier, SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11)
ORDER BY Date
Run Code Online (Sandbox Code Playgroud)
我用它来查看上个月货物移动的结果。结果是按日期分组的cd_tracking金额列表,如下所示:
| Amount | Carrier | Date |
|--------|---------|------------|
| 2599 | 44 | 01/08/2015 |
| 2504 | 44 | 03/08/2015 |
| 4597 | 44 | 04/08/2015 |
| 5058 | 44 | 05/08/2015 |
| 2413 | 44 | 06/08/2015 |
| 4853 | 44 | 07/08/2015 |
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果某一天没有cd_tracking = 14,那一天将不会显示在结果列表中。如您所见,列表中没有8 月 2日。
我想知道有没有办法把每一天都带上结果列表,即使那天没有cd_tracking = 14。像这样:
| Amount | Carrier | Date |
|--------|---------|------------|
| 2599 | 44 | 01/08/2015 |
| NULL | 44 | 02/08/2015 |
| 2504 | 44 | 03/08/2015 |
| 4597 | 44 | 04/08/2015 |
| 5058 | 44 | 05/08/2015 |
| 2413 | 44 | 06/08/2015 |
| 4853 | 44 | 07/08/2015 |
Run Code Online (Sandbox Code Playgroud)
将条件从WHERE子句移至条件计数:
SELECT
COUNT(CASE WHEN CD_TRACKING = 14 THEN CD_BarCode ELSE NULL END),
CD_Carrier,
DATEPART(DAY, DT_Arriving) as [Date]
FROM TB_AGIL
WHERE
DT_Arriving >= @date
AND DT_Arriving < DATEADD(MONTH,+1,@date)
GROUP BY
CD_Carrier,
DATEPART(DAY, DT_Arriving)
ORDER BY
[Date];
Run Code Online (Sandbox Code Playgroud)
可以在此处找到实现已弃用 GROUP BY ALL 语法的其他方法。