SQL Server-按月排列选择查询结果
我有以下查询(以及其他几个非常类似的查询),它收集大量数据(在本例中是调用),然后按月进行排列 它工作正常,输出我需要的结果,但我觉得必须有一种更实用/更短的方法:SQL Server-按月排列选择查询结果,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有以下查询(以及其他几个非常类似的查询),它收集大量数据(在本例中是调用),然后按月进行排列 它工作正常,输出我需要的结果,但我觉得必须有一种更实用/更短的方法: SELECT sum(case when datepart(mm,calldate) = '1' THEN 1 ELSE 0 END) AS 'JAN', sum(case when datepart(mm,calldate) = '2' THEN 1 ELSE 0 END) AS 'FEB', sum(case when d
SELECT
sum(case when datepart(mm,calldate) = '1' THEN 1 ELSE 0 END) AS 'JAN',
sum(case when datepart(mm,calldate) = '2' THEN 1 ELSE 0 END) AS 'FEB',
sum(case when datepart(mm,calldate) = '3' THEN 1 ELSE 0 END) AS 'MAR',
sum(case when datepart(mm,calldate) = '4' THEN 1 ELSE 0 END) AS 'APR',
sum(case when datepart(mm,calldate) = '5' THEN 1 ELSE 0 END) AS 'MAY',
sum(case when datepart(mm,calldate) = '6' THEN 1 ELSE 0 END) AS 'JUN',
sum(case when datepart(mm,calldate) = '7' THEN 1 ELSE 0 END) AS 'JUL',
sum(case when datepart(mm,calldate) = '8' THEN 1 ELSE 0 END) AS 'AUG',
sum(case when datepart(mm,calldate) = '9' THEN 1 ELSE 0 END) AS 'SEP',
sum(case when datepart(mm,calldate) = '10' THEN 1 ELSE 0 END) AS 'OCT',
sum(case when datepart(mm,calldate) = '11' THEN 1 ELSE 0 END) AS 'NOV',
sum(case when datepart(mm,calldate) = '12' THEN 1 ELSE 0 END) AS 'DEC'
FROM [Telephony].[dbo].[tbl_Outbound]
WHERE source like '132%'
and duration > 300
union all
SELECT
sum(case when datepart(mm,calldate) = '1' THEN 1 ELSE 0 END) AS 'JAN',
sum(case when datepart(mm,calldate) = '2' THEN 1 ELSE 0 END) AS 'FEB',
sum(case when datepart(mm,calldate) = '3' THEN 1 ELSE 0 END) AS 'MAR',
sum(case when datepart(mm,calldate) = '4' THEN 1 ELSE 0 END) AS 'APR',
sum(case when datepart(mm,calldate) = '5' THEN 1 ELSE 0 END) AS 'MAY',
sum(case when datepart(mm,calldate) = '6' THEN 1 ELSE 0 END) AS 'JUN',
sum(case when datepart(mm,calldate) = '7' THEN 1 ELSE 0 END) AS 'JUL',
sum(case when datepart(mm,calldate) = '8' THEN 1 ELSE 0 END) AS 'AUG',
sum(case when datepart(mm,calldate) = '9' THEN 1 ELSE 0 END) AS 'SEP',
sum(case when datepart(mm,calldate) = '10' THEN 1 ELSE 0 END) AS 'OCT',
sum(case when datepart(mm,calldate) = '11' THEN 1 ELSE 0 END) AS 'NOV',
sum(case when datepart(mm,calldate) = '12' THEN 1 ELSE 0 END) AS 'DEC'
FROM [Telephony].[dbo].[tbl_Outbound]
WHERE source like '132%'
感谢您提供的任何提示:)我相信以下方法会奏效。这将使用SQL Server的透视功能:
SELECT rowName,[January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December]
FROM (
SELECT
"Duration>300" as rowName,
datename(month, calldate) as MonthName,
Count(*) as recordCount
FROM
[Telephony].[dbo].[tbl_Outbound]
WHERE source like '132%'
and duration > 300
UNION ALL
SELECT
"AllDurations" as rowName,
datename(month, calldate) as MonthName,
Count(*) as recordCount
FROM
[Telephony].[dbo].[tbl_Outbound]
WHERE source like '132%'
) as SourceTable
PIVOT
(
Sum(recordCount)
FOR MonthName in ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])
) AS PivotTable
你真的不在乎calldate是在2014年还是2013年?这相当冗长,但冗长似乎是因为需要交叉表/轴心样式的输出,而在月份计数时则更少。你可以在没有联合的情况下在一个查询中完成这一切,但它看起来同样丑陋。Lamak-此表仅包含12个月的滚动数据,因此在本例中为noJNevill-需要此格式是因为我在excel中将此查询作为数据连接,因此,数据以我需要的格式显示出来,因为我有几个这样的查询,它们填充了一个数据表。@Uberzeni;如果您希望更改答案的意图/功能,请添加注释,而不是直接编辑。编辑仅用于修改/改进答案,不改变意图。谢谢!我不知道你能做到,这真的很有帮助!我所做的所有调整都是通过calldate添加到一个组中,并在rowname后面添加一个缺少的逗号,这对于没有服务器来测试这一点来说并不坏!