Sql server 2008 如何使用月份名称打印sql查询结果
我有一个SQL查询,它检索月份计数 例: 我需要知道的是,如果没有特定月份的记录,如何打印该月份并将其计数显示为0 这是我的疑问:Sql server 2008 如何使用月份名称打印sql查询结果,sql-server-2008,Sql Server 2008,我有一个SQL查询,它检索月份计数 例: 我需要知道的是,如果没有特定月份的记录,如何打印该月份并将其计数显示为0 这是我的疑问: select DATETNAME(MONTH, c.postTime) as Month, COUNT(c.regNo) as Count from Company c where DATENAME(YEAR, c.postTime) = 2015 group by c.postTime 此查询返回以下结果: MONTH
select
DATETNAME(MONTH, c.postTime) as Month, COUNT(c.regNo) as Count
from
Company c
where
DATENAME(YEAR, c.postTime) = 2015
group by
c.postTime
此查询返回以下结果:
MONTH | Count
-----------------
July | 2
August | 1
我想要的结果应该是:
MONTH | Count
-----------------
January | 0
February| 0
March | 0
April | 0
May | 0
June | 0
July | 2
August | 1
.
.
.
so on...
一种方法是将它们从锚查询中拉出来,在锚查询中,所有月份的列表都被显式写入,然后左键加入表公司: 如果表公司没有任何特定月份,则会显示计数0 您还可以使用递归CTE生成从1到12的数字,并将这些整数转换为月份名称:
;WITH CTE
AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1
FROM CTE
WHERE n < 12
), Months
AS
(
SELECT DATENAME(Month,
DATEADD(Month,
n-1,
CAST('2015-01-01' AS datetime))) AS Name
FROM CTE
)
SELECT m.Name, COUNT(COALESCE(c.regNo, 0)) as Count
FROM Months AS m
LEFT JOIN Company c ON DATETNAME(MONTH, c.postTime) = m.Name
WHERE DATENAME(YEAR, c.postTime) = 2015
GROUP BY m.Name;
使用And而不是Where关键字。然后它将按预期工作。它将给出一个错误,如列m。名称在选择列表中无效,因为它不包含在聚合函数或分组依据中clause@SumuduDeZoysa-抱歉我的错误,请尝试更新的查询,我更新了我的答案。谢谢@Mahmoud。当我将Where关键字改为AND时,您的答案是正确的。谢谢:
SELECT m.Name, COUNT(COALESCE(c.regNo, 0)) as Count
FROM
(
VALUES ('Janurary'), ('February'), ('March'),
('April'), ('May'), ('June'),
('July'), ('August'), ('September'),
('October'), ('November'), ('December')
) AS m(Name)
LEFT JOIN Company c ON DATETNAME(MONTH, c.postTime) = m.Name
WHERE DATENAME(YEAR, c.postTime) = 2015
GROUP BY m.Name;
;WITH CTE
AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1
FROM CTE
WHERE n < 12
), Months
AS
(
SELECT DATENAME(Month,
DATEADD(Month,
n-1,
CAST('2015-01-01' AS datetime))) AS Name
FROM CTE
)
SELECT m.Name, COUNT(COALESCE(c.regNo, 0)) as Count
FROM Months AS m
LEFT JOIN Company c ON DATETNAME(MONTH, c.postTime) = m.Name
WHERE DATENAME(YEAR, c.postTime) = 2015
GROUP BY m.Name;
SELECT m.Name, COUNT(COALESCE(c.regNo, 0)) as Count
FROM
(
VALUES ('Janurary'), ('February'), ('March'),
('April'), ('May'), ('June'),
('July'), ('August'), ('September'),
('October'), ('November'), ('December')
) AS m(Name)
LEFT JOIN Company c ON DATETNAME(MONTH, c.postTime) = m.Name
AND DATENAME(YEAR, c.postTime) = 2015
GROUP BY m.Name;