2017-09-18 9 views
-1

私はSQL(より正確にはT-SQL)を使い慣れていないので、私はこの問題を回避することはできません。私は単純な解決策があると確信しています。私は考えていません(サブクエリやテーブルピボットを含むかもしれません)。しかし、私はあなたのうちの1人がSQLクラウドを手伝ってくれることを期待していました。ケース番号別にTSQLの複数の行を組み合わせる

基本的に、私はこのデータを有効にする必要があります。

CaseNumber|DecisionNumber|Date  |Decision 
----------+--------------+-----------+-------- 
444  |29833   |04/05/2005 |Sell 
444  |29777   |05/10/2006 |Sell 
444  |29654   |08/19/2007 |Buy 
468  |29230   |08/19/2006 |Sell 
468  |29192   |08/19/2011 |Sell 

この結果の中へ:

CaseNumber|DecisionNumber1|Date1  |Decision1|DecisionNumber2|Date2  |Decision2|DecisionNumber3|Date3  |Decision3 
----------+---------------+------------+---------+---------------+------------+---------+---------------+------------+--------- 
444  |29833   |04/05/2005 |Sell  |29777   |05/10/2006 |Sell  |29654   |08/19/2007 |Buy 
468  |29230   |08/19/2006 |Sell  |29192   |08/19/2011 |Sell  |NULL   |NULL  |NULL 

任意のアイデアをいただければ幸いです。

答えて

1

あなたがしようとしている問題は、一度に複数の列をピボットしようとしていることです。これは、unpivot、次にpivotで行うことができます。このような何か:

WITH CTE 
AS 
(
    SELECT 
    CAST(CaseNumber AS NVARCHAR(50)) AS CaseNumber 
    ,CAST(DecisionNumber AS NVARCHAR(50)) AS DecisionNumber 
    ,CAST(Date AS NVARCHAR(50)) AS [Date] 
    ,ROW_NUMBER() OVER(PARTITION BY [CaseNumber] ORDER BY DecisionNumber DESC) AS RN 
    FROM Table1 
), unpivoted 
AS 
(
    SELECT CaseNumber, val, col + ' ' + CAST(RN AS NVARCHAR(50)) AS col 
    FROM CTE 
    UNPIVOT 
    (
    val 
    FOR col IN(DecisionNumber, Date) 
) AS u 
) 
SELECT * 
FROM unpivoted AS u 
PIVOT 
(
    MAX(val) 
    FOR col IN([DecisionNumber 1], [Date 1], 
      [DecisionNumber 2], [Date 2], 
      [DecisionNumber 3], [Date 3]) 
) AS p; 

これはあなたを与える:

| CaseNumber | DecisionNumber 1 |  Date 1 | DecisionNumber 2 |  Date 2 | DecisionNumber 3 |  Date 3 | 
|------------|------------------|------------|------------------|------------|------------------|------------| 
|  444 |   29833 | 2005-04-05 |   29777 | 2006-05-10 |   29654 | 2007-08-19 | 
|  468 |   29230 | 2006-08-19 |   29192 | 2011-08-19 |   (null) |  (null) | 

をしかし、あなたはdecisionnumberdate、任意の数のためにこれをしたい場合これを行うことができます:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

WITH CTE 
AS 
(
    SELECT 
    CAST(CaseNumber AS NVARCHAR(50)) AS CaseNumber 
    ,CAST(DecisionNumber AS NVARCHAR(50)) AS DecisionNumber 
    ,CAST(Date AS NVARCHAR(50)) AS [Date] 
    ,ROW_NUMBER() OVER(PARTITION BY [CaseNumber] ORDER BY DecisionNumber DESC) AS RN 
    FROM Table1 
), Data 
AS 
(
    SELECT col, MAX(RN) AS RN 
    FROM 
    (
    SELECT RN, col + CAST(RN AS NVARCHAR(50)) AS col 
    FROM CTE 
    UNPIVOT 
    (
     val 
     FOR col IN(DecisionNumber, Date) 
    ) AS u 
) AS t 
    GROUP BY col 
) 
select @cols = STUFF((SELECT ',' + 
         QUOTENAME(col) 
         FROM Data 
         ORDER BY RN 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 'WITH CTE 
AS 
(
    SELECT 
    CAST(CaseNumber AS NVARCHAR(50)) AS CaseNumber 
    ,CAST(DecisionNumber AS NVARCHAR(50)) AS DecisionNumber 
    ,CAST(Date AS NVARCHAR(50)) AS [Date] 
    ,ROW_NUMBER() OVER(PARTITION BY [CaseNumber] ORDER BY DecisionNumber DESC) AS RN 
    FROM Table1 
), unpivoted 
AS 
(
    SELECT CaseNumber, val, col + CAST(RN AS NVARCHAR(50)) AS col 
    FROM CTE 
    UNPIVOT 
    (
    val 
    FOR col IN(DecisionNumber, Date) 
) AS u 
) 
SELECT * 
FROM unpivoted AS u 
PIVOT 
(
    MAX(val) 
    FOR col IN('+ @cols + ') 
) AS p;'; 


EXECUTE(@query); 
+0

ありがとう!それは魅力のように働いた。私がしなければならなかったのは、日付を日付時刻に再変換することでした。 [日付1]はNULLではなく、TRY_CONVERT(DATETIME、[日付1]、100)はNULLではありません THEN CONVERT(DATETIME、 DATE 1]、100) ELSE [DATE 1] END [日付1] –

関連する問題