0

私はSQL Server 2008 R2に取り組んでいます。私は以下の2つのテーブルを持っています:

CREATE TABLE TRK_REQUEST(
REQUEST_ID int,
APPROVER_ID int CONSTRAINT app_ID_fk FOREIGN KEY REFERENCES TRK_APPROVER(APPROVER_ID),
APPROVER_LEVEL int)

CREATE TABLE TRK_APPROVER(APPROVER_ID int IDENTITY(1,1) PRIMARY KEY,
NAME Varchar(10))

INSERT INTO TRK_APPROVER VALUES('Approver_1'),('Approver_2'),('Approver_3')

INSERT INTO TRK_REQUEST VALUES(1, 1, 0),(1, 2, 1), (1, 3, 2)

私が欲しいのはのバージョンですがgroup_concat()、値は別々の列にある必要があります(カンマ区切りではありません)

テーブルに参加してみましたが、

SELECT REQ.REQUEST_ID, APP.NAME FROM TRK_REQUEST REQ
JOIN TRK_APPROVER APP
ON REQ.APPROVER_ID = APP.APPROVER_ID

しかし、それは私に3つの異なる行を与えます。

目的の出力は次のようになります。

| Request_ID  |    APPROVER_NAME1    |    APPROVER_NAME2    |    APPROVER_NAME3
+-------------+----------------------+----------------------+--------------------+
| 1           |    Approver_1        |    Approver_2        |    Approver_3

ここSOで一致する例をいくつか見つけましたが、期待したものではありませんでした。あなたの助けを求めています。

SQL フィドル

4

1 に答える 1

1

動的クロス集計を使用できます:

DECLARE @sql1   VARCHAR(4000) = ''
DECLARE @sql2   VARCHAR(4000) = ''
DECLARE @sql3   VARCHAR(4000) = ''

SELECT @sql1 = 
'SELECT
    r.REQUEST_ID' + CHAR(10)

SELECT @sql2 = @sql2 +
'   , [' + a.NAME + '] = MAX(CASE WHEN a.APPROVER_ID = ' + CONVERT(VARCHAR(10), a.APPROVER_ID) + ' THEN a.NAME END)' + CHAR(10)
FROM (
    SELECT * FROM TRK_APPROVER
)a
ORDER BY a.APPROVER_ID

SELECT @sql3 = 
'FROM TRK_REQUEST r
INNER JOIN TRK_APPROVER a
    ON a.APPROVER_ID = r.APPROVER_ID
GROUP BY r.REQUEST_ID
ORDER BY r.REQUEST_ID
'

PRINT (@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)

SQL フィドル

于 2015-03-16T05:48:21.500 に答える