Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 显示0而不是不显示的查询_Sql_Gaps And Islands - Fatal编程技术网

Sql 显示0而不是不显示的查询

Sql 显示0而不是不显示的查询,sql,gaps-and-islands,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 JO

以下查询正在显示我想要的结果,但我希望它在非生产状态下每个月显示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,而不是什么都不显示。如何???

如果要在数据中显示所有月份,最简单的方法可能是使用条件聚合。你对这个月的计算似乎有些笨拙。你似乎想要上个月的工作,所以:

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)
选择年份(DATEADD(MONTH,-1,months.mstart)),
月份(DATEADD(MONTH,-1,months.mstart)),
合并(总和(pd溢价),0)作为总产量
从(值(转换(日期为2019-08-01')),
(转换(日期:2019-09-01”),
(转换(日期:2019-10-01'))
)剩余月数(MSStart)加入
保单详情pd
在pd.IssuedDate>=日期添加(月-1,月.mstart)和
pd.IssuedDate
我想这可能是SQL-IF的一个用例

语法如下:

SELECT IF([condition], "YES", "NO");
在您的情况下,尝试将其与您的查询结合起来

也许是这样:

SELECT IF([subquery > 0] AS X, X, 0);
如果条件类似:

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

但是您必须将该输出与上面发布的现有查询相结合,才能在表格已填充时获得输出。

(1)使用您正在使用的数据库(看起来像SQL Server)标记您的问题。(2) 你的算术很奇怪。为什么要将前一个月作为月份,而不是年份?如果
PolicyDetails.IssuedDate
是在1月份,那么您将得到12月份作为月份,并得到年份的正确值,您还需要计算前一个月作为年。“SQL”(如“标准SQL”)中没有
IF
-一些方言,如T-SQL(Microsoft)支持它,尽管我通常使用mySQL-