sqlserver取相同列下其餘不同列的數據連接

今天在項目中遇到的這個問題,確實糾結我挺久的。其實這種需求如果用代碼來實現的話只需要一個典然後就能實現,然而,有時候就偏偏讓你寫個sql,然後就去執行下就OK了,因此,問題就來了(標題挺亂的,也取得很不好)

其實這裏的思想很簡單,就是分列插入臨時表,然後處理臨時表,最終得到結果

語文能力很差,那就直接上代碼:


/*******原需求:
--1 導出所有四級(省、市、區/縣、鎮/街道)、所屬區號、工作時長、能否取貨、能否派貨、所屬分部
--1.1 若“所屬區號、上班時間、下班時間、是否有記錄、所屬分部”存在不同的值,則並列顯示(逗號隔開)
********/
--第一步:取出所需字段,並去重
select distinct DR_250,DR_251,DR_252,DR_260,DR_234,DR_254,DR_273,DR_274,DR_208 
into #TMP from  TB_DriverDomainNew	

--第二步:取單個差異字段,並保存到臨時表中
SELECT distinct DR_250,DR_251,DR_252,DR_260,DR_208 INTO #TMP1 FROM #TMP--選擇有DR_208不相同的記錄
SELECT distinct DR_250,DR_251,DR_252,DR_260,DR_234 INTO #TMP2 FROM #TMP--選擇有DR_234不相同的記錄
SELECT distinct DR_250,DR_251,DR_252,DR_260,DR_254 INTO #TMP3 FROM #TMP--選擇有DR_254不相同的記錄
SELECT distinct DR_250,DR_251,DR_252,DR_260,DR_273 INTO #TMP4 FROM #TMP--選擇有DR_273不相同的記錄
SELECT distinct DR_250,DR_251,DR_252,DR_260,DR_274 INTO #TMP5 FROM #TMP--選擇有DR_274不相同的記錄

--第三步:合併不停記錄,並用逗號隔開
select DR_250,DR_251,DR_252,DR_260,
(select ',' + DR_208 from #TMP1 as A where B.DR_260 = A.DR_260 AND B.DR_251 = A.DR_251 AND B.DR_250 = A.DR_250 AND B.DR_252 = A.DR_252  for XML path('')) AS DR_208
 INTO #TMP1_1 from #TMP1 as B
GROUP BY DR_250,DR_251,DR_252,DR_260

select DR_250,DR_251,DR_252,DR_260,
(select ',' + DR_234 from #TMP2 as A where B.DR_260 = A.DR_260 AND B.DR_251 = A.DR_251 AND B.DR_250 = A.DR_250 AND B.DR_252 = A.DR_252  for XML path('')) AS DR_234
 INTO #TMP2_2 from #TMP2 as B
GROUP BY DR_250,DR_251,DR_252,DR_260


select DR_250,DR_251,DR_252,DR_260,	--數值類型需要轉換convert(nvarchar(3),DR_254)
(select ',' + convert(nvarchar(3),DR_254) from #TMP3 as A where B.DR_260 = A.DR_260 AND B.DR_251 = A.DR_251 AND B.DR_250 = A.DR_250 AND B.DR_252 = A.DR_252  for XML path('')) AS DR_254
 INTO #TMP3_3 from #TMP3 as B
GROUP BY DR_250,DR_251,DR_252,DR_260


select DR_250,DR_251,DR_252,DR_260,
(select ',' + DR_273 from #TMP4 as A where B.DR_260 = A.DR_260 AND B.DR_251 = A.DR_251 AND B.DR_250 = A.DR_250 AND B.DR_252 = A.DR_252  for XML path('')) AS DR_273
INTO #TMP4_4 from #TMP4 as B
GROUP BY DR_250,DR_251,DR_252,DR_260

select DR_250,DR_251,DR_252,DR_260,
(select ',' + DR_274 from #TMP5 as A where B.DR_260 = A.DR_260 AND B.DR_251 = A.DR_251 AND B.DR_250 = A.DR_250 AND B.DR_252 = A.DR_252  for XML path('')) AS DR_274
 INTO #TMP5_5 from #TMP5 as B
GROUP BY DR_250,DR_251,DR_252,DR_260

--第四步:連接獲取所有記錄
SELECT T1.DR_250,T1.DR_251,T1.DR_252,T1.DR_260,T1.DR_208,T2.DR_234,t3.DR_254,T4.DR_273,T5.DR_274 INTO #TMP_F FROM #TMP1_1  T1
LEFT JOIN #TMP2_2 T2 ON T2.DR_260 = T1.DR_260 AND T2.DR_251 = T1.DR_251 AND T2.DR_250 = T1.DR_250 AND T2.DR_252 = T1.DR_252
LEFT JOIN #TMP3_3 T3 ON T3.DR_260 = T1.DR_260 AND T3.DR_251 = T1.DR_251 AND T3.DR_250 = T1.DR_250 AND T3.DR_252 = T1.DR_252
LEFT JOIN #TMP4_4 T4 ON T4.DR_260 = T1.DR_260 AND T4.DR_251 = T1.DR_251 AND T4.DR_250 = T1.DR_250 AND T4.DR_252 = T1.DR_252
LEFT JOIN #TMP5_5 T5 ON T5.DR_260 = T1.DR_260 AND T5.DR_251 = T1.DR_251 AND T5.DR_250 = T1.DR_250 AND T5.DR_252 = T1.DR_252

--第五步:去掉開頭逗號,得到最終結果
SELECT DR_250,DR_251,DR_252,DR_260
,SUBSTRING(DR_234, 2, Len(DR_234)-1) DR_234 
,SUBSTRING(DR_254, 2, Len(DR_254)-1) AS DR_254 
,SUBSTRING(DR_273, 2, Len(DR_273)-1) AS DR_273 
,SUBSTRING(DR_274, 2, Len(DR_274)-1) AS DR_274 
,SUBSTRING(DR_208, 2, Len(DR_208)-1) AS DR_208 
FROM #TMP_F 
WHERE ISNULL(DR_260, '')<>''

--第六步:刪臨時表
DROP TABLE #TMP
DROP TABLE #TMP1
DROP TABLE #TMP2
DROP TABLE #TMP3
DROP TABLE #TMP4
DROP TABLE #TMP5
DROP TABLE #TMP_F

DROP TABLE #TMP1_1
DROP TABLE #TMP2_2
DROP TABLE #TMP3_3
DROP TABLE #TMP4_4
DROP TABLE #TMP5_5
                                                                                                                                                                    

代碼看起來確實非常凌亂,這確實是我本身的原因,但是還是希望對大家有所幫助,也是我自己的一個知識積累,希望下次遇到的時候能夠更快的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章