2017-04-22 17 views
0

TEMP表に挿入されたデータを参照する問合せがあります(その表には機密情報が含まれていません)。列1を同じに保つ必要がありますが、動的に2番目の列をPIVOTする必要があります。

私は必要な情報を得ることができますが、私はそれをより整理する必要があります。今、私はこれを取得するには、次の問合せを使用してい

trac_id CONTACT_DATE 
040 2017-02-20 00:00:00.000 
059 2017-03-08 00:00:00.000 
001 2017-03-01 00:00:00.000 
001 2017-03-08 00:00:00.000 
001 2017-03-13 00:00:00.000 
001 2017-03-16 00:00:00.000 
001 2017-03-16 00:00:00.000 
001 2017-03-17 00:00:00.000 
001 2017-03-22 00:00:00.000 
001 2017-03-23 00:00:00.000 
001 2017-03-23 00:00:00.000 
001 2017-03-24 00:00:00.000 
001 2017-03-27 00:00:00.000 
001 2017-03-27 00:00:00.000 
001 2017-03-30 00:00:00.000 
001 2017-03-31 00:00:00.000 
068 2017-02-13 00:00:00.000 
067 2017-01-24 00:00:00.000 
060 2017-02-08 00:00:00.000 
060 2017-03-07 00:00:00.000 
011 2017-02-16 00:00:00.000 
011 2017-03-01 00:00:00.000 
011 2017-03-23 00:00:00.000 
011 2017-03-30 00:00:00.000 
005 2017-02-16 00:00:00.000 
005 2017-03-18 00:00:00.000 
005 2017-03-08 00:00:00.000 
013 2017-03-08 00:00:00.000 
013 2017-03-13 00:00:00.000 
013 2017-03-16 00:00:00.000 
013 2017-03-16 00:00:00.000 
013 2017-03-17 00:00:00.000 
013 2017-03-22 00:00:00.000 
013 2017-03-23 00:00:00.000 
013 2017-03-24 00:00:00.000 
013 2017-03-27 00:00:00.000 
013 2017-03-27 00:00:00.000 
013 2017-03-30 00:00:00.000 
013 2017-03-30 00:00:00.000 
013 2017-03-31 00:00:00.000 
043 2017-02-03 00:00:00.000 

として

出力データが表示さ:私が取得する必要がどのような

SELECT 
    spl.trac_id 
    ,pev.CONTACT_DATE 


FROM 
    #SAMHSA_PAT_LIST spl 
    INNER JOIN dbo.IDENTITY_ID_VIEW iiv 
    ON iiv.IDENTITY_ID=spl.MRN 
    LEFT JOIN dbo.PAT_ENC_VIEW pev 
    ON pev.PAT_ID = iiv.PAT_ID 
    LEFT JOIN dbo.PAT_ENC_RSN_VISIT_VIEW rsn 
    ON rsn.PAT_ENC_CSN_ID=pev.PAT_ENC_CSN_ID 

WHERE 
    pev.CONTACT_DATE >= @Start_Date 
    AND pev.CONTACT_DATE < @End_Date 
    AND pev.APPT_STATUS_C IN (2 , 6 , 8 , 9) 
    AND rsn.ENC_REASON_ID = 590; 

は、2つの+ n列を持つことです。私は、正確に何回目かを見て、trac_id 001が14個のエントリで示されているかどうかは分かりません。もしそれが最大数なら、私はPIVOTにしたい列の数をハードコーディングすることなく、trac_id、mm_1、mm_2、mm_3、mm_4、...、mm_14の列を必要とします。私の問題は、PIVOTを使ってみたすべての投稿とドキュメントでは、データが事前にテーブルに挿入されていて、通常はテーブル全体がPIVOTされていることです。

2番目の列のみをPIVOTすることは可能ですか?そうであれば、どうすればよいですか?

私はいくつかの投稿とヘルプ@Jakub_Ojmucianskiに基づいて私の解決策の一部を理解することができました。私は何を作ってみたことは以下の通りですが、それは唯一中途半端そこだと私は間違い作ったと確信している:

DECLARE @SQL VARCHAR(MAX)='',@PVT_COL VARCHAR(MAX)=''; 

SELECT @PVT_COL [email protected]_COL + '[mm_'+CAST(ROW_NUMBER() OVER(ORDER BY (SELECT 
1)) AS VARCHAR(4))+'],' 
    FROM #medmtemp 
SELECT @PVT_COL = LEFT(@PVT_COL,LEN(@PVT_COL)-1) 

SELECT @SQL = 
'SELECT * FROM (
SELECT trac_id, Contact ,''mm_''+CAST(ROW_NUMBER() OVER(ORDER BY (SELECT 1)) 
AS VARCHAR(4)) AS COL_NME 
FROM #medmtemp 
)AS A 
PIVOT 
(
    MAX(Contact) FOR COL_NME IN ('[email protected]_COL+') 
)PVT' 

EXEC (@SQL) 

を私が(ただ、最初の3つの新しい行を含む)、次を参照してください。

trac_id mm_1 mm_2 mm_3 mm_4 mm_5 mm_6 mm_7 mm_8 mm_9 mm_10 mm_11 mm_12 mm_13 mm_14 mm_15 mm_16 mm_17 mm_18 mm_19 mm_20 
1 3/1/2017 3/8/2017 3/13/2017 3/16/2017 3/16/2017 3/17/2017 3/22/2017 3/23/2017 3/23/2017 3/24/2017 3/27/2017 3/27/2017 3/30/2017 3/31/2017 NULL NULL NULL NULL NULL NULL 
5 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2/16/2017 3/18/2017 3/8/2017 NULL NULL NULL 
8 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 3/8/2017 3/23/2017 3/30/2017 
+0

さがすダイナミックPIVOT' – Squirrel

答えて

0

あなたはそのようなこと行うことができます。

IF(OBJECT_ID('tempdb..#myTable') IS NOT null) 
    DROP TABLE #myTable 

IF(OBJECT_ID('tempdb..#pivotColumn') IS NOT null) 
    DROP TABLE #pivotColumn 

CREATE TABLE #myTable 
(
trac_id varchar(3), 
CONTACT_DATE datetime 
) 

INSERT INTO #myTable VALUES 
('040', '2017-02-20 00:00:00.000'), 
('059' ,'2017-03-08 00:00:00.000'), 
('001' ,'2017-03-01 00:00:00.000'), 
('001' ,'2017-03-08 00:00:00.000'), 
('001' ,'2017-03-13 00:00:00.000'), 
('001' ,'2017-03-16 00:00:00.000'), 
('001' ,'2017-03-17 00:00:00.000') 

SELECT ROW_NUMBER() OVER(ORDER BY CONTACT_DATE) as rowNumber,CONTACT_DATE INTO #pivotColumn FROM(
SELECT DISTINCT CONTACT_DATE FROM #myTable 
) AS source 


DECLARE @columns VARCHAR(MAX)='' 
DECLARE @curentRow int = 1; 
WHILE @curentRow <= (SELECT MAX(rowNumber) from #pivotColumn) 
BEGIN 
    SET @columns+= '['+(SELECT Cast(CONTACT_DATE as varchar) FROM #pivotColumn WHERE rowNumber = @curentRow)+'],' 
    SET @curentRow += 1; 
END 

SET @columns = SUBSTRING(@columns,1,LEN(@columns)-1) 


DECLARE @code Varchar(MAX) = 
' 
SELECT * FROM #myTable 
Pivot 
(
COUNT(trac_id) FOR CONTACT_DATE IN (
' 
+ 
@columns 
+ 
' 
) 
) as p' 

EXEC(@code) 

をしかし、動的ピボットに機能をグループ化を意識する - あなたはこれらのデータをどうしたいのかを決める必要がありますか?それを数え、数えますか?

よろしく `ため

+0

だから、私は結果を持っていますが、私がやろうとしていることは私は1つを作成する必要はありませんので、PIVOTを定義したら動作します示唆しているものデータを取得するためにクエリを実行し、別のクエリを実行して提示します。データは提出用であり、各NULL以外の結果はそれぞれ別の列にある必要があります(政府がスマートな方法で物事を求めることが時々あると尋ねないでください)。私が何を読んでいるのか分かっているのであれば、Selectテーブルをcreateテーブルに置き換えてtempテーブルに入れても問題ありません。 – Erik

+0

私は今、部分的な解決策を持っています。私は動的に作成された列を取得しましたが、各一意のtrac_idを最初からやり直すのではなく、各行に列を追加するだけです。私が後にしたことではないが、次のコメントを参照 – Erik

+0

それを無視して、私はPIVOTの追加で私の質問を更新したが、まだ私は行方不明の何かがある。 – Erik

関連する問題