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

如何将这三个查询合并到一张表中?

谢谢 !

4

1 回答 1

1

PIVOT您可以使用该功能轻松执行此操作。如果您只有site上面显示的 3 个值,那么您可以对这些值进行硬编码,类似于:

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 回答