1

これが私のSQLテーブルです:

Table1
Col1   Col2
a      1
a      2
a      3
b      1
c      1
c      2

このテーブルをクエリして、このように表示するにはどうすればよいですか?

col1,value1,value2,value3
a,1,2,3
b,1,null,null
c,1,2,null

col1 の各値のレコードが 5 つを超えることはありません。col2 の値はわかりません。動的になります。

4

2 に答える 2

3

SQL 2005 以降を使用している場合は、PIVOT が適切なオプションです。静的クエリの場合、値の最大数は 1、2、3... であると想定して、次のように PIVOT を使用できます。

SELECT Col1 AS 'Col1', 
[1], [2], [3], [4], [5]
FROM
(SELECT Col1, Col2 
    FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN ([1], [2], [3], [4], [5])
) AS PivotTable;

動的 SQL を受け入れる場合は、次を使用して SQL ステートメントを作成し、実行できますsp_executesql

DECLARE @Values VARCHAR(1000)
DECLARE @SQL NVARCHAR(MAX)
SET @Values = NULL

SELECT 
    @Values = COALESCE(@Values + ', ', '') +  + '[' + CAST(Col2 AS VARCHAR) + ']'
FROM (SELECT DISTINCT TOP 100 PERCENT Col2 FROM dbo.Table1 ORDER BY 1) T

SET @SQL = '
SELECT Col1 AS ''Col1'', 
' + @Values + '
FROM
(SELECT Col1, Col2 
    FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN (' + @Values + ')
) AS PivotTable;
'
EXECUTE sp_executesql @SQL
于 2012-05-10T03:07:24.747 に答える
0

データベースは、あなたが求めていることをうまく実行できません。それが可能であり、誰かがここに解決策を投稿すると確信していますが、小さな bash スクリプトを使用すると、作業が楽になるかもしれません。

このコードは、列 1 のすべての一意の値のリストを取得します。次に、列 1 の指定された値について、列 2 のすべての値をテーブルに照会します。「tr」コマンドは、改行文字をコンマに置き換え、sed コマンドを実行します。最後のコンマを改行文字に戻します。

特定の問題についてもっと投稿していただければ、問題のより良い解決策があるのではないかと思います。純粋なクエリであるソリューションでは、テーブルをそれ自体に 5 回リンクする必要があり、テーブルのサイズによっては多くの処理が必要になる可能性があります。

注:質問には詳細が含まれていなかったため、いくつかの仮定を立てました。postgresql を使用しており、データベースは test と呼ばれていると想定しています。

#!/bin/bash                                                                     

echo "select distinct col1 from table1 order by col1" | psql -At test | while read col1;do
    echo -n "$col1,"
    echo "select col2 from table1 where col1='$col1' order by col2" | psql -At test | tr '\n' ',' | sed s/,$/\n/'

done

出力は次のとおりです。

a,1,2,3
b,1
c,1,2
于 2012-05-10T02:54:13.233 に答える