0

我们正在使用票证跟踪系统,我想了解每月为每种产品创建多少票证的信息:

产品 1 月 12 日 2 月 12 日
产品 1 130 99
产品 2 13 14
产品 3 7 9
产品 4       
产品 5 13 7
产品 6 22 31
产品 7       
产品 8 10 5

数据库:MS SQL Server 2008 表名:incidentbase 相关字段:* Createdon (datetime) * Productname (nvarchar)

我可以使用以下 SQL 获取信息,但不能以上面显示的格式:

Select (convert(varchar(7), CreatedOn, 102)) as 'month', Productname as Product,  COUNT(*) as number
from Incidentbase
where createdon >= '2011-01-01'
group by Productname, (convert(varchar(7), CreatedOn, 102))
ORDER BY (convert(varchar(7), i.CreatedOn, 102))
月 产品编号
2011.01 产品1 1
2011.01 产品2 93
2011.01 产品3 20
2011.02 产品1 98
2011.02 产品2 23
2011.02 产品3 7

知道如何更改 SQL 以显示正确的分组吗?

4

1 回答 1

1

在 SQL Server 中,您可以实现PIVOT从列中的行转换数据的函数:

select productname,
  [2011.01], 
  [2011.02]
from
(
  select ProductName,
    (convert(varchar(7), CreatedOn, 102)) as 'month'
  from Incidentbase
  where createdon >= '2011-01-01'
) src
pivot
(
  count(month)
  for month in ([2011.01], [2011.02])
) piv

请参阅带有演示的 SQL Fiddle

如果您想要转换为列的日期数量未知,则可以使用动态 SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME((convert(varchar(7), CreatedOn, 102))) 
                    from Incidentbase
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ProductName,' + @cols + ' from 
             (
                  select ProductName,
                    (convert(varchar(7), CreatedOn, 102)) as month
                  from Incidentbase
                  where createdon >= ''2011-01-01''
            ) x
            pivot 
            (
                count(month)
                for month in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo

如果您想将日期传递给动态查询,那么您将使用稍微不同的代码版本:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @startdate datetime

set @startdate = '2011-01-01'

select @cols = STUFF((SELECT distinct ',' + QUOTENAME((convert(varchar(7), CreatedOn, 102))) 
                    from Incidentbase
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ProductName,' + @cols + ' from 
             (
                  select ProductName,
                    (convert(varchar(7), CreatedOn, 102)) as month
                  from Incidentbase
                  where createdon >= '+convert(varchar(10), @startdate, 120)+'
            ) x
            pivot 
            (
                count(month)
                for month in (' + @cols + ')
            ) p '

execute(@query)

请参阅带有演示的 SQL Fiddle

于 2013-02-13T11:36:47.930 回答