1

我的表中有一些数据如下:

 ID     Name
  2    219SUN_BV_Secure_Gateway.pdf
  3    197FDD_BV_Secure_Gateway.pdf
  5    225RQB_BV_Secure_Gateway.pdf
  6    A_00025_Q1_2012.pdf         
  7    A_00025_Q2_2012.pdf         
  8    A_00025_Q3_2011.pdf         
  9    C_00025_Q3_2011_PostLLC.pdf
 10    B_00025_Q3_2011.pdf        

我想按照以下要求获取数据:

  • 在第一列中,我想要名称以 A 开头的数据
  • 在第二列中,我想要名称以 B 开头的数据
  • 在第三列中,我想要名称以 C 开头的数据

我使用了这个查询:

SELECT 
    CASE 
        WHEN DocumentFile LIKE 'A%' THEN DocumentFile 
    END as DocFile_A,
    CASE
        WHEN DocumentFile LIKE 'B%' THEN DocumentFile 
    END as DocFile_B,
    CASE 
        WHEN DocumentFile LIKE 'C%' THEN DocumentFile 
    END as DocFile_C 
FROM 
    RFP_DocumentVault 

这将返回以下结果:

DocFile_A              DocFile_B          DocFile_C
 NULL          NULL             NULL
 NULL          NULL             NULL
 NULL          NULL             NULL
 A_00025_Q1_2012.pdf   NULL             NULL
 A_00025_Q2_2012.pdf   NULL             NULL
 A_00025_Q3_2011.pdf   NULL             NULL
 NULL          NULL           C_00025_Q3_2011_Post Partners II, LLC.pdf
 NULL          B_00025_Q3_2011.pdf        NULL

但我想要的结果如下:

 DocFile_A            DocFile_B                 DocFile_C
 A_00025_Q1_2012.pdf  B_00025_Q3_2011.pdf     C_00025_Q3_2011_Post Partners II, LLC.pdf
 A_00025_Q2_2012.pdf  NULL                      NULL
 A_00025_Q3_2011.pdf  NULL                      NULL

知道我该怎么做吗?

4

2 回答 2

6

同意@GolezTrol,这也许应该在演示级别解决。但是,如果您绝对确定需要在 SQL 中执行此操作,这里有一个替代他们的解决方案:

WITH ranked AS (
  SELECT
    DocumentFile,
    grp = 'DocFile_' + LEFT(DocumentFile, 1),
    rnk = ROW_NUMBER() OVER (
      PARTITION BY LEFT(DocumentFile, 1)
      ORDER BY DocumentFile
    )
  FROM RFP_DocumentVault
)
SELECT *
FROM ranked
PIVOT (
  MAX(DocumentFile) FOR grp IN (DocFile_A, DocFile_B, DocFile_C)
) p
;

SQL Fiddle也有一个现场演示。

于 2012-09-22T12:33:18.583 回答
3

奇怪的要求。在我看来,这是一个显示问题,而不是查询应该解决的问题,但没关系。我这里没有 SQL Server,但请尝试以下操作:

select
  DocFile_A, DocFile_B, DocFile_C
from
    (select
      row_number() over (order by DocumentFile) as RowNum_A,
      DocumentFile as DocFile_A
    from
      RFP_DocumentVault
    where
      DocumentFile like 'A%') A
    full outer join
    (select
      row_number() over (order by DocumentFile) as RowNum_B,
      DocumentFile as DocFile_B
    from
      RFP_DocumentVault
    where
      DocumentFile like 'B%') B on RowNum_B = RowNum_A
    full outer join
    (select
      row_number() over (order by DocumentFile) as RowNum_C,
      DocumentFile as DocFile_C
    from
      RFP_DocumentVault
    where
      DocumentFile like 'C%') C on RowNum_C = RowNum_A or RowNum_C = RowNum_B
order by
  RowNum_A, RowNum_B, RowNum_C
于 2012-09-22T12:11:46.597 回答