1

私は成功できなかった問題をフォローしています。あなたの助けに感謝します。私は SQL 2005 を使用しており、CTE を使用してこれを実行しようとしています。

テーブルには次の 2 つの列があります

DocNum    DocEntry
1              234
2              324
2              746
3              876
3              764
4              100
4              387

期待される結果は次のとおりです

1                 234
2                 324, 746
3                 876, 764
4                 100, 387

ありがとうラフル・ジェイン


コメントから転写されたさらなる説明:

次のようなクエリを使用しています。

WITH ABC (DocNum, DocEntry) AS
   (SELECT DocNum, Cast(DocEntry As VARCHAR(8000))
        FROM Temp5
        WHERE DocNum = 1
    UNION ALL
    SELECT a.DocNum, A.DocEntry + ', ' + B.DocEntry
        FROM ABC B INNER JOIN Temp5 A ON B.DocNum +1= A.DocNum
         WHERE A.DOCNUM > 1)
SELECT * FROM ABC;

上記のクエリの結果は次のとおりです

1 234
2 234, 324
2 234, 746
3 234, 746, 876
3 234, 746, 764

問題に示されているように、これらの数字を繰り返したくありません。

4

4 に答える 4

3

これを行う方法を説明する記事は次のとおりです。

複数の行を CSV 文字列に変換する

于 2008-12-27T15:28:14.373 に答える
2

CTEがあなたの問題に対する完全な答えだとは思いません。あなたが求めているのは、PIVOT 内の列の数がクエリ時に不明な PIVOT クエリです。この質問と回答は、あなたが求めているもののように見えます:

SQL 2005 の PIVOT

SQL 2005 の PIVOT

上記の回答の例から、これはテーブル用に変更された SQL です (「q395075」と名付けたので、テーブル名に置き換えるだけです):

DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
    SELECT DISTINCT PIVOT_CODE
    FROM (
        SELECT DocNum, DocEntry, ROW_NUMBER() OVER (PARTITION BY DocNum ORDER BY DocEntry) AS PIVOT_CODE
        FROM q395075
    ) AS rows
) AS PIVOT_CODES

SET @sql = '
;WITH p AS (
    SELECT DocNum, DocEntry, ROW_NUMBER() OVER (PARTITION BY DocNum ORDER BY DocEntry) AS PIVOT_CODE
    FROM q395075
)
SELECT DocNum, ' + @select_list + '
FROM p
PIVOT (
    MIN(DocEntry)
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
'

PRINT @sql

EXEC (@sql)
于 2008-12-27T16:25:42.697 に答える
1
SELECT 
    DocNum,
    STUFF((SELECT ', ' + CAST(DocEntry AS VARCHAR(MAX)) AS [text()]
        FROM Temp5 b
        WHERE a.DocNum = b.DocNum
        FOR XML PATH('')), 1, 2, '') AS DocEntry
FROM Temp5 a
GROUP BY DocNum

Itzik Ben-Gan は、著書T-SQL QUERYINGで、集計文字列の連結に特化したソリューションをいくつか提供しています。クエリ自体が悲鳴を上げます。

于 2008-12-28T21:06:47.077 に答える
0
create table #a(DocNum int,  DocEntry int)

insert into #a
select 1,234 union all
select 2,324 union all
select 2,746 union all
select 3,876 union all
select 3,764 union all
select 4,100 union all
select 4,387 


select
    DocNum,
    stuff((
        select ',' + convert(varchar(25),t.DocEntry)
        from #a t
        where t.DocNum = t1.DocNum
        order by t.DocEntry
        for xml path('')
    ),1,1,'') as name_csv
from #a t1
group by DocNum
; 

出力

DocNum name_sv

   1    234    
   2    324,746    
   3    764,876    
   4    100,387   
于 2016-06-14T22:57:55.517 に答える