1
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(ACT_DESC)
FROM (SELECT DISTINCT ACT_DESC FROM tpc) AS desc

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT MDCODE, ' + @ColumnName + '
    FROM tpc
    PIVOT(MAX(ACTUAL_DATE) 
          FOR tpcIN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

このクエリは次を表示します。

MDCODE | sample1 | sample2
--------------------------
123    | 1/2014  | 
123    |         | 2/2014
123    |         | 3/2014

私が欲しいのはこれです:

MDCODE | sample1 | sample2
--------------------------
123    | 1/2014  | 2/2014,3/2014

列データを連結する方法を知っている人はいますか? 任意のヒント?

これは私がデータを取得するテーブルです:

   mdcode | act_desc | actual_date
   --------------------------
   1234   | sample1  | 1/2014
   1234   | sample2  | 2/2014
   1234   | sample2  | 3/2014

actual_date は日時です

4

2 に答える 2

2

SQL Server では、カンマ区切りの出力のタイプは「for xml path」で実現されますが、通常は stuff() にも関連付けられています。

必要に応じて「クロス適用」を使用しますが、そのようにする必要はありません。

このようにアプローチします。今は使用しないでくださいpivot。MDCODE と ACT_DESC を個別またはグループごとに減らしてから、相互適用を使用して「日付」の文字列を連結します。それらが本当に日付である場合は、それらをvarcharに変換する必要があります.convert(varchar,actual_date,112)

| MDCODE | ACT_DESC |  ACTUAL_DATES |
|--------|----------|---------------|
|   1234 |  sample1 |        1/2014 |
|   1234 |  sample2 | 2/2014,3/2014 |

によって生産:

SELECT
      d.mdcode
    , d.act_desc
    , ca1.actual_dates
FROM (
            SELECT DISTINCT
                  [mdcode]
                , [act_desc]
            FROM Table1
      ) d
      CROSS APPLY (
                  SELECT
                        STUFF((
                              SELECT
                                    ',' + a.actual_date
                              FROM table1 a
                              WHERE a.mdcode = d.mdcode
                                  AND a.act_desc = d.act_desc --<< change here
                              ORDER BY a.actual_date
                              FOR xml PATH ('')
                        )
                        , 1, 1, '')
            ) AS ca1 (actual_dates)
;

ちなみに、STUFF() は、連結から最初のコンマを削除するために使用されます。これが唯一の役割です。CROSS APPLY は、from 句の一部としてその句の前に実行されるため、select 句で相関サブクエリを使用するよりも間違いなく優れています。前に言ったように、オプションですが、私はそれを好みます。

参照: http://sqlfiddle.com/#!3/a24ba/4 &これらのサンプルも参照してください

于 2014-08-14T05:41:19.630 に答える
1

PIVOT を完全にスキップして、次のように FOR XML_PATH だけを使用します。

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @DynamicPivotQuery= ISNULL(@DynamicPivotQuery + ',','select mdcode,') 
       + 'stuff((select '',''+actual_date from tpc where mdcode=t.mdcode and act_desc = ''' + ACT_DESC + ''' for xml path(''''),type).value(''.'',''varchar(max)''),1,1,'''') '
       + QUOTENAME(ACT_DESC)
FROM (SELECT DISTINCT ACT_DESC FROM tpc) AS des

select @DynamicPivotQuery = @DynamicPivotQuery + 'from tpc t group by mdcode'
EXEC sp_executesql @DynamicPivotQuery

動的クエリは、次のようなクエリを生成します。

select mdcode,
        stuff(
              (
                select ','+actual_date
                from tpc where mdcode=t.mdcode and act_desc = 'sample1'
                for xml path(''),type
              ).value('.','varchar(max)')
              ,1,1,'') sample1,
        stuff(
              (
                select ','+actual_date
                from tpc where mdcode=t.mdcode and act_desc = 'sample2'
                for xml path(''),type
              ).value('.','varchar(max)')
              ,1,1,'') sample2
from tpc t
group by mdcode;

SQL Fiddleは、静的クエリと動的クエリを示しています

于 2014-08-14T06:06:36.323 に答える