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 に答える