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 で始まるデータが必要です
  • 2列目に、名前がBで始まるデータが必要です
  • 3 列目に、名前が 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 に答える