2017-05-24 13 views
0

MS-SQLServer-2016を使用していて、行を列に転記する必要があります。 ピボットと動的SQLオプションを使用して、行数が動的であるため、このオプションを使用しています。 図1は現在私が得ている出力です。しかし、クライアントはそれらのNULLを表示したくありません。彼はNot-Nullの日付を表示するだけです。 Null値を取り除き、異なる日付のみを表示する方法はありますか?Microsoft SQL Serverの列をPiVOTを使用して列を転置する

に関して

Figure1-Transpose_Output

タヌジャ

DECLARE @columns AS NVARCHAR(MAX), @sql AS NVARCHAR(MAX), @var1 AS 
VARCHAR(MAX); 

SELECT @columns = stuff((select DISTINCT ',' + quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ')) 
         from engagement_action n, action_party m, personal p 
         where n.action_id = m.action_id 
          and p.party_id = m.party_id 
          and n.action_note like 'XXX' 
          and m.system_name = 'XXXXXXXXXXXX' 
          and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 

SELECT @sql = 

       'select "RANK_IN_PROP" , 
       customer_number, 
       customer_shortname, 
       system_name, 
       '+ @columns + ' 
       from 
        (SELECT RANK() OVER (PARTITION BY convert(date,m.created_when) ORDER BY convert(date,m.created_when))"RANK_IN_PROP" , 
          p.customer_number, 
          p.customer_shortname, 
          m.system_name, 
          m.created_when , 
          convert(date,m.created_when) as created_when, 
          replace(replace(replace(n.action_note,'' '',''<>''),''><'',''''),''<>'','' '') as action_note1 
        FROM engagement_action n, action_party m, personal p 
        WHERE n.action_id = m.action_id 
        AND p.party_id = m.party_id 
        AND n.action_note like ''%XXX%'' 
        AND m.system_name = ''XXXXXXXXXXX'' 
        AND p.customer_number = ''XXXXXXXX'') d 
        PIVOT 
        (max(created_when) for action_note1 in (' + @columns + '))p order by created_when desc' 

execute(@sql);` 
+0

[アーロンベルトラン使用して、古いスタイルJOINをキックする悪い習慣]を実行することができませんでした/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) – SqlZim

+0

使用している実績表の行結果セットを作成しないでください。 –

+0

'from(select ...)'を 'pivot()'とする列だけでなく、カラムをピボットするように減らす必要があります。次に、 'pivot()'の結果に参加して、他のすべての列を追加します。 – SqlZim

答えて

0

あなたはこれを試すことができ、ちょうどwhere句に(action_noteがnullでない明確なaction_noteのengagement_actionを選択)を加えました。 (http://sqlblog.com/blogs/aaron_bertrand/archive - :私は、テストデータを作成することはできませんように、実際にクエリ

SELECT @columns = stuff((select DISTINCT ',' + 
quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ') 
) 
        from 
        (select distinct action_note engagement_action where action_note is not null) 
        n, action_party m, personal p 
        where n.action_id = m.action_id 
         and p.party_id = m.party_id 
         and n.action_note like 'XXX' 
         and m.system_name = 'XXXXXXXXXXXX' 
         and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 
+0

こんにちはSrinivasa Rao、私は同じ出力を得ています。これは、あなたが言ったところでaction_noteのdistinctと言っても、これらの行が転置されるときに別個の列名に終わるだけです。とにかく日付には影響しません。 –

関連する問題