sqlserver取相同列下其余不同列的数据连接
来源:互联网 发布:网页版数据库查询工具 编辑:程序博客网 时间:2024/05/21 19:43
今天在项目中遇到的这个问题,确实纠结我挺久的。其实这种需求如果用代码来实现的话只需要一个典然后就能实现,然而,有时候就偏偏让你写个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 BGROUP BY DR_250,DR_251,DR_252,DR_260select 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 BGROUP BY DR_250,DR_251,DR_252,DR_260select 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 BGROUP BY DR_250,DR_251,DR_252,DR_260select 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_273INTO #TMP4_4 from #TMP4 as BGROUP BY DR_250,DR_251,DR_252,DR_260select 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 BGROUP 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 T1LEFT 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_252LEFT 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_252LEFT 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_252LEFT 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 #TMPDROP TABLE #TMP1DROP TABLE #TMP2DROP TABLE #TMP3DROP TABLE #TMP4DROP TABLE #TMP5DROP TABLE #TMP_FDROP TABLE #TMP1_1DROP TABLE #TMP2_2DROP TABLE #TMP3_3DROP TABLE #TMP4_4DROP TABLE #TMP5_5
代码看起来确实非常凌乱,这确实是我本身的原因,但是还是希望对大家有所帮助,也是我自己的一个知识积累,希望下次遇到的时候能够更快的实现
阅读全文
0 0
- sqlserver取相同列下其余不同列的数据连接
- 合并同一行内不同列的相同数据
- sqlserver合并“id值相同”的列
- sql 多列数据相同的情况下进行合并。
- 使用游标将excel不同表的列关联,并根据两表间相同的列值逐行更新数据
- 合并相同列的数据(引用)
- 页面合并多列相同的数据
- excel比较两组或两列数据的相同项和不同项
- 得到数组的中数据的个数和取sqlserver数据库中列长度。
- Oracle相同的列不同的行合并
- 同一个表中一列相同,另一列不同的
- 如何Excel中找出不同两列的相同值
- loadrunner实现使用相同excel文档不同列的数据同时参数化多个字段,实现插入的数据一一对应
- 取每一列的第一条数据
- shell 取出第一列相同但第二列不同的行
- 将指定索引列的数据相同的行合并
- 取datatable的列
- excel公式:获取两列数据中相同的数据,并展示在第三列。
- tomcat服务器配置jvm参数
- Armadillo C++ Library
- normfit
- 手机聊天记录备份与恢复的方法汇总
- 更新SDK,R文件消失的解决办法
- sqlserver取相同列下其余不同列的数据连接
- MySQL · 引擎特性 · Group Replication内核解析
- KEIL、uVision、RealView、MDK、KEIL C51区别比较
- C#操作数据库
- LeetCode 216. Combination Sum III
- 解决eclipse 导出 Ruannable jar文件资源无法访问的一个办法
- 善用“脚手架”,让应用开发事半功倍
- grant命令给用户授权,使mysql实现远程连接
- 有关数据库中添加 where1=1 的问题