Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-按月排列选择查询结果_Sql_Sql Server_Ssms - Fatal编程技术网

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后面添加一个缺少的逗号,这对于没有服务器来测试这一点来说并不坏!