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