以下查询显示的是我想要的结果,除了我希望非生产每个月显示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,而不显示任何内容。怎么样??
答案 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);
但是您必须将输出与上面发布的现有查询结合起来,以在表被填充时获得输出。