2

私はこのようなテーブルを持っています:

DECLARE @myTable TABLE (SampleID varchar(max), site varchar(max), SPDate date)  
  INSERT @myTable
    SELECT 'A-1', 1, '9/1/2012'   UNION ALL
    SELECT 'A-2', 1, '10/1/2012'  UNION ALL
    SELECT 'A-3', 1, '10/15/2012' UNION ALL
    SELECT 'A-5', 1, '5/1/2012'   UNION ALL
    SELECT 'A-4', 1, '1/1/2012'   UNION ALL
    SELECT 'B-1', 2, '11/1/2012'  UNION ALL
    SELECT 'B-2', 2, '8/1/2012'   UNION ALL
    SELECT 'B-3', 2, '5/1/2012'   UNION ALL
    SELECT 'B-4', 2, '4/1/2012'   UNION ALL
    SELECT 'C-1', 3, '10/1/2012'  UNION ALL
    SELECT 'C-2', 3, '10/15/2012' UNION ALL
    SELECT 'C-3', 3, '7/1/2012' ; 

私が欲しいのは、今日から75日を超えるすべての日付を取得し、降順で並べ替えるクエリです(たとえば、最新の日付が最初になります)。

したがって、私のテーブルの場合、出力は次のようになります。

    Site1    Site2   Site3
     A-1      B-2     C-2
     A-5      B-3     C-3
     A-4      B-4

だから私はSite1、Site2、Site3のクエリをこのように分離する方法を知っています

 SELECT SampleID FROM @myTable
     WHERE  DATEDIFF(DAY, SPDate, GETDATE()) > 75 AND
     site=1 ORDER BY SPDate DESC

これらの3つのクエリを1つのテーブルにするにはどうすればよいですか?

ありがとう !

4

1 に答える 1

1

関数を使用すると、これを簡単に実行できPIVOTます。上記の 3 つの値しかない場合はsite、次のように値をハードコーディングできます。

select [Site1], [Site2], [Site3]
from
(
  select SampleID, 
    'Site'+ cast(site as varchar(10)) SiteNumber
     ,row_number() over(partition by site order by spdate desc) rn
  from myTable 
  where DateDiff(day, spdate, getdate()) >75
) src
pivot
(
  max(SampleID)
  for SiteNumber in ([Site1], [Site2], [Site3])
) piv;

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

しかし、サイトの数が不明な場合は、これの動的 SQL バージョンを実装できます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Site'+ site) 
                    from myTable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
               select SampleID, 
                 ''Site''+ cast(site as varchar(10)) SiteNumber
                  ,row_number() over(partition by site order by spdate desc) rn
               from myTable 
               where DateDiff(day, spdate, getdate()) >75
            ) x
            pivot 
            (
                max(SampleID)
                for SiteNumber in (' + @cols + ')
            ) p '

execute(@query)

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

どちらも同じ結果を生成します。

| SITE1 | SITE2 |  SITE3 |
--------------------------
|   A-1 |   B-2 |    C-3 |
|   A-5 |   B-3 | (null) |
|   A-4 |   B-4 | (null) |
于 2012-11-30T10:51:08.570 に答える