查询显示0而不显示

时间:2019-11-17 13:29:50

标签: sql gaps-and-islands

以下查询显示的是我想要的结果,除了我希望非生产每个月显示0。

SELECT 
  DATENAME(MONTH, DATEADD(M, MONTH(PolicyDetails.IssuedDate), - 1)) AS Month, 
  SUM(PolicyDetails.Premium) AS TotalProduction, 
  DATENAME(YEAR, PolicyDetails.IssuedDate) AS Year 
FROM PolicyDetails INNER JOIN Clients 
ON PolicyDetails.ClientId = Clients.ClientId 
WHERE (Clients.Username = @Username) 
GROUP BY MONTH(PolicyDetails.IssuedDate), DATENAME(YEAR, PolicyDetails.IssuedDate)


Month   Total Production -$$
  2019 - August 30.00
  2019 - October    45.00

在此表中,我想显示“ 2019年-9月”,其总生产= 0,而不显示任何内容。怎么样??

2 个答案:

答案 0 :(得分:1)

如果要显示数据中的所有月份,则最简单的方法可能是使用条件聚合。您对本月的计算似乎很尴尬。您似乎想要上个月,所以:

SELECT DATENAME(YEAR, pd.IssuedDate) AS Year,
       DATENAME(MONTH, DATEADD(MONTH, -1, pd.IssuedDate)) AS Month, 
       SUM(CASE WHEN c.Username = @Username THEN pd.Premium ELSE 0 END) AS TotalProduction          
FROM PolicyDetails pd INNER JOIN
     Clients c
     ON pd.ClientId = c.ClientId 
GROUP BY DATENAME(YEAR, pd.IssuedDate), DATENAME(MONTH, DATEADD(MONTH, -1, pd.IssuedDate))
ORDER BY MIN(pd.IssuedDate)

这假设您每月在数据中至少有一行。

否则,规范的方法是生成所需的月份(使用派生表或递归CTE或日历表)。您的月份算术对于该解决方案来说有点尴尬。看起来像:

SELECT YEAR(DATEADD(MONTH, -1, months.mstart)),
       MONTH(DATEADD(MONTH, -1, months.mstart)),
       COALESCE(SUM(pd.Premium), 0) AS TotalProduction          
FROM (VALUES (CONVERT(DATE, '2019-08-01')),
             (CONVERT(DATE, '2019-09-01')),
             (CONVERT(DATE, '2019-10-01'))
     ) months(mstart) LEFT JOIN
     PolicyDetails pd
     ON pd.IssuedDate >= DATEADD(month, -1, months.mstart)  AND
        pd.IssuedDate < months.mstart LEFT JOIN
     Clients c
     ON pd.ClientId = c.ClientId AND
        c.Username = @Username
GROUP BY YEAR(DATEADD(MONTH, -1, months.mstart)),
         MONTH(DATEADD(MONTH, -1, months.mstart))
ORDER BY MIN(pd.IssuedDate)

答案 1 :(得分:0)

我想这可能是SQL-IF的用例。

语法如下:

SELECT IF([condition], "YES", "NO");

在您的情况下,请尝试将其与查询结合在一起。

也许是这样:

SELECT IF([subquery > 0] AS X, X, 0);

如果条件类似:

SELECT IF((SELECT COUNT(*) FROM PolicyDetails ) > 0, 1, 0);

但是您必须将输出与上面发布的现有查询结合起来,以在表被填充时获得输出。

相关问题