按日期分组时甚至返回空组

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)

Pau*_*ite 4

将条件从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 语法的其他方法。