1

これを生成するいくつかの JOINS からデータを収集する SELECT ステートメントがあります。

Site    Description Status
  1     Project 1   Not Started
  1     Project 5   In Progress
  1     Project 2   Testing
  1     Project 12  Complete
  1     Project 2   Not Started
  2     Project 13  Not Started
  2     Project 20  Testing
  2     Project 21  In Progress
  2     Project 22  In Progress
  2     Project 23  Testing
  3     Project 24  Not Started
  3     Project 25  Not Started
  3     Project 26  Testing
  3     Project 29  Complete

生産する各サイトのステータスを要約したいと思います。

Site    Not Started In Progress Testing Complete
   1        2              1       1       1
   2        1              2       2       0
   3        2              0       1       1

「WITH」句を使用して出力を処理できるはずです。現在、次のようになります。

WITH SiteData AS (SELECT data from multiple JOINS...)

SELECT Site, Description, Status FROM SiteData

そのため、データの列を表示するだけでなく、サイトごとのさまざまなステータスのそれぞれに含まれるプロジェクトの数に置き換えたいと考えています。

それは理にかなっていますか?

4

1 に答える 1

4

このタイプのデータ変換は、ピボットと呼ばれます。行データを列に変換するには、いくつかの方法があります。

集計関数を次のように使用できますCASE

select site,
  sum(case when Status = 'Not Started' then 1 else 0 end) [Not Started],
  sum(case when Status = 'In Progress' then 1 else 0 end) [In Progress],
  sum(case when Status = 'Testing' then 1 else 0 end) Testing,
  sum(case when Status = 'Complete' then 1 else 0 end) Complete
from sitedata
group by site

SQL Fiddle with Demoを参照してください。

sitedataを既存のクエリに置き換えます。

PIVOTまたは、次の関数を使用できます。

select site,
  [Not Started], 
  [In Progress], 
  Testing, 
  Complete
from
(
  select [Site], Status
  from sitedata
) src
pivot
(
  count(Status)
  for Status in ([Not Started], [In Progress], Testing, Complete)
) piv

SQL Fiddle with Demoを参照してください。

値の数が不明な場合は、Status動的 SQL を使用できます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME([Status]) 
                    from SiteData
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT site, ' + @cols + ' from 
             (
                select [Site], Status
                from sitedata
            ) x
            pivot 
            (
                count(Status)
                for Status in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demoを参照してください。

各クエリの結果は同じです。

| SITE | NOT STARTED | IN PROGRESS | TESTING | COMPLETE |
---------------------------------------------------------
|    1 |           2 |           1 |       1 |        1 |
|    2 |           1 |           2 |       2 |        0 |
|    3 |           2 |           0 |       1 |        1 |

編集#1、Total行が必要な場合は、次を使用できます:

select 
  case when site is not null then cast(site as varchar(10)) else 'Total' end Site,
  sum([Not Started]) [Not Started], 
  Sum([In Progress])[In Progress], 
  Sum(Testing) Testing, 
  sum(Complete) Complete,
  Sum([Not Started]+[In Progress]+ Testing+ Complete) Total
from
(
  select [Site], Status
  from sitedata
) src
pivot
(
  count(Status)
  for Status in ([Not Started], [In Progress], Testing, Complete)
) piv
group by rollup (site)

デモで SQL Fiddle を参照してください

于 2013-02-25T19:17:35.173 に答える