SQL 计数为0时显示月份
SQL display months when Count is 0
我想知道是否有人可以帮助我...
我有以下 SQL 查询(已将其缩短为一个大型联合查询)
SELECT [ Month ],
sum(total)
from
(select datename(month,Resolved1Date) as ' Month ',
COUNT(case when
fileDescription not like 'test%'
and Issue1Description ='Escalated' then 0 else 1 end) as 'total'
FROM complaint_1 WITH (nolock) INNER JOIN
Case WITH (nolock) ON Case.ref = complaint_1.ref
WHERE
Resolved1Date >=DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)
Resolved1Date <= dateadd(mm,datediff(mm,0,getdate()),0)
group by datename(month,Resolved1Date), datepart(month, Resolved1Date)
)x
group by [ Month ]
order by [ Month ] desc
查询计算解决日期介于当年的第一天和小于当月的所有案例。我的问题是,如果一个月没有结果,则不包括该月,我希望我的结果 return 类似于:-
jan 5
feb 10
march 7
apr 0
may 2
谁能指导我正确的方向?
您可以创建临时 table 并从中左连接。
像这样:
DECLARE @Helper TABLE
(
TheDate datetime
)
DECLARE @StartDate datetime
SELECT @StartDate = '01.01.2015'
WHILE @StartDate < DATEADD(day,7,GETDATE())
BEGIN
INSERT INTO @Helper (Thedate) VALUES (@StartDate)
SELECT @StartDate = DATEADD(MONTH, 1, @StartDate)
END
希望对您有所帮助。
创建一组月份作为 from 子句中的第一个 table,并将您的查询加入其中。然后你会得到每个月的结果。
我在财务报告方面也有类似的问题,我需要所有月份和财政年度的结果。
我已经使用 DATENAME 函数来确保与您的查询结果一致。
如果您想要按月顺序(1 月 - 2 月 - 3 月)的数据,您可能不想按月排序,因为这将按字母顺序排列,您需要包含一个排序字段。
SELECT M.[ Month ] AS [ Month ]
,SUM(ISNULL(x.total,0)) AS [Total] -- x.total will be null for months with no transactions.
FROM -- Set of Months (need one record for each month)
(SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)) AS M
LEFT OUTER JOIN -- Your from clause goes here.
(SELECT *
FROM (VALUES (DATENAME(month,'2015-01-01'),5)
,(DATENAME(month,'2015-02-01'),4)
,(DATENAME(month,'2015-02-01'),6)
,(DATENAME(month,'2015-03-01'),7)
,(DATENAME(month,'2015-04-01'),0)
,(DATENAME(month,'2015-05-01'),1)
,(DATENAME(month,'2015-05-01'),1)
) AS data(" Month ","total")) x ON x.[ Month ] = M.[ Month ]
GROUP BY M.[ Month ], M.MnthSort
ORDER BY M.MnthSort
我 运行 这个在 SQL Server 2008 - R1
查询中 from 子句的第一部分以 table 格式定义了一组月份,每个月返回一行(运行 以查看结果):
SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)
它之后的LEFT OUTER JOIN是link把你查询到每个月的结果,所以每个月得到一个总和。因为没有每个月的总计,所以使用了外连接。
使用上面的 sql 的查询如下:
SELECT M.[ Month ] AS [ Month ]
,SUM(ISNULL(x.total,0)) AS [Total] -- x.total will be null for months with no transactions.
FROM -- Set of Months (January - December), ensures one record for each month
(SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)) AS M
LEFT OUTER JOIN -- Your Query included from here...
(SELECT datename(month,Resolved1Date) as ' Month ',
COUNT(CASE WHEN fileDescription NOT LIKE 'test%'
AND Issue1Description ='Escalated' THEN 0 ELSE 1
END) as 'total'
FROM complaint_1 WITH (nolock)
INNER JOIN Case WITH (nolock) ON Case.ref = complaint_1.ref
WHERE
Resolved1Date >=DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)
Resolved1Date <= dateadd(mm,datediff(mm,0,getdate()),0)
group by datename(month,Resolved1Date), datepart(month, Resolved1Date)
) x on x.[ Month ] = M.[ Month ]
GROUP BY M.[ Month ], M.MnthSort
ORDER BY M.MnthSort
我想知道是否有人可以帮助我...
我有以下 SQL 查询(已将其缩短为一个大型联合查询)
SELECT [ Month ],
sum(total)
from
(select datename(month,Resolved1Date) as ' Month ',
COUNT(case when
fileDescription not like 'test%'
and Issue1Description ='Escalated' then 0 else 1 end) as 'total'
FROM complaint_1 WITH (nolock) INNER JOIN
Case WITH (nolock) ON Case.ref = complaint_1.ref
WHERE
Resolved1Date >=DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)
Resolved1Date <= dateadd(mm,datediff(mm,0,getdate()),0)
group by datename(month,Resolved1Date), datepart(month, Resolved1Date)
)x
group by [ Month ]
order by [ Month ] desc
查询计算解决日期介于当年的第一天和小于当月的所有案例。我的问题是,如果一个月没有结果,则不包括该月,我希望我的结果 return 类似于:-
jan 5
feb 10
march 7
apr 0
may 2
谁能指导我正确的方向?
您可以创建临时 table 并从中左连接。
像这样:
DECLARE @Helper TABLE
(
TheDate datetime
)
DECLARE @StartDate datetime
SELECT @StartDate = '01.01.2015'
WHILE @StartDate < DATEADD(day,7,GETDATE())
BEGIN
INSERT INTO @Helper (Thedate) VALUES (@StartDate)
SELECT @StartDate = DATEADD(MONTH, 1, @StartDate)
END
希望对您有所帮助。
创建一组月份作为 from 子句中的第一个 table,并将您的查询加入其中。然后你会得到每个月的结果。 我在财务报告方面也有类似的问题,我需要所有月份和财政年度的结果。 我已经使用 DATENAME 函数来确保与您的查询结果一致。 如果您想要按月顺序(1 月 - 2 月 - 3 月)的数据,您可能不想按月排序,因为这将按字母顺序排列,您需要包含一个排序字段。
SELECT M.[ Month ] AS [ Month ]
,SUM(ISNULL(x.total,0)) AS [Total] -- x.total will be null for months with no transactions.
FROM -- Set of Months (need one record for each month)
(SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)) AS M
LEFT OUTER JOIN -- Your from clause goes here.
(SELECT *
FROM (VALUES (DATENAME(month,'2015-01-01'),5)
,(DATENAME(month,'2015-02-01'),4)
,(DATENAME(month,'2015-02-01'),6)
,(DATENAME(month,'2015-03-01'),7)
,(DATENAME(month,'2015-04-01'),0)
,(DATENAME(month,'2015-05-01'),1)
,(DATENAME(month,'2015-05-01'),1)
) AS data(" Month ","total")) x ON x.[ Month ] = M.[ Month ]
GROUP BY M.[ Month ], M.MnthSort
ORDER BY M.MnthSort
我 运行 这个在 SQL Server 2008 - R1
查询中 from 子句的第一部分以 table 格式定义了一组月份,每个月返回一行(运行 以查看结果):
SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)
它之后的LEFT OUTER JOIN是link把你查询到每个月的结果,所以每个月得到一个总和。因为没有每个月的总计,所以使用了外连接。
使用上面的 sql 的查询如下:
SELECT M.[ Month ] AS [ Month ]
,SUM(ISNULL(x.total,0)) AS [Total] -- x.total will be null for months with no transactions.
FROM -- Set of Months (January - December), ensures one record for each month
(SELECT * FROM (VALUES(DATENAME(month,'2015-01-01'),1)
,(DATENAME(month,'2015-02-01'),2)
,(DATENAME(month,'2015-03-01'),3)
,(DATENAME(month,'2015-04-01'),4)
,(DATENAME(month,'2015-05-01'),5)
,(DATENAME(month,'2015-06-01'),6)
,(DATENAME(month,'2015-07-01'),7)
,(DATENAME(month,'2015-08-01'),8)
,(DATENAME(month,'2015-09-01'),9)
,(DATENAME(month,'2015-10-01'),10)
,(DATENAME(month,'2015-11-01'),11)
,(DATENAME(month,'2015-12-01'),12)) AS Mnth(" Month ",MnthSort)) AS M
LEFT OUTER JOIN -- Your Query included from here...
(SELECT datename(month,Resolved1Date) as ' Month ',
COUNT(CASE WHEN fileDescription NOT LIKE 'test%'
AND Issue1Description ='Escalated' THEN 0 ELSE 1
END) as 'total'
FROM complaint_1 WITH (nolock)
INNER JOIN Case WITH (nolock) ON Case.ref = complaint_1.ref
WHERE
Resolved1Date >=DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)
Resolved1Date <= dateadd(mm,datediff(mm,0,getdate()),0)
group by datename(month,Resolved1Date), datepart(month, Resolved1Date)
) x on x.[ Month ] = M.[ Month ]
GROUP BY M.[ Month ], M.MnthSort
ORDER BY M.MnthSort