Sql server 2008 如何使用月份名称打印sql查询结果

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

我有一个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   | 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;