首页 / MSSQL / SqlServerl的行转列
SqlServerl的行转列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SqlServerl的行转列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2237字,纯文字阅读大概需要4分钟。
内容图文
目录
@( SqlServerl的行转列)
关键词:SqlServer
问题背景
- hql语句不熟悉,多表联查的时候都是在业务层在写其他的方法去查。(感觉真的好菜啊,但是还是要直面现实)。
- 测试的时候发现数据过滤的不对。有很多所谓的”重复"数据。以我项目中的两个场景为例。
场景1
如图化学品和类型是一对多的关系。如果按普通的左关联查询查到的数据应该是,每一个化学品有几个类型就会有几条数据。所以这里用到的是==多行转多列==
--多行转多列
SELECT O.CHEMICAL_ID,O.CAS,O.JC,
==max(CASE O.DETAILS_NAME WHEN '重点监管' THEN O.TZLBBM ELSE 0 end)重点监管,
max(CASE O.DETAILS_NAME WHEN '易制毒' THEN O.TZLBBM ELSE 0 end)易制毒,
max(CASE O.DETAILS_NAME WHEN '易制爆' THEN O.TZLBBM ELSE 0 end)易制爆,
max(CASE O.DETAILS_NAME WHEN '剧毒化学品' THEN O.TZLBBM ELSE 0 end)剧毒化学品,
max(CASE O.DETAILS_NAME WHEN '高毒物品' THEN O.TZLBBM ELSE 0 end)高毒物品==
FROM (SELECT C.*,E.DETAILS_NAME,T.TZLBBM FROM TB_BASE_CHEMICAL AS C
LEFT JOIN TB_BASE_CHEMICAL_TZLB AS T ON T.CHEMICAL_ID=C.CHEMICAL_ID
LEFT JOIN TB_HSE_DICTIONARY_DETAILS AS E ON E.DETAILS_CODE=T.TZLBBM AND E.COM_DEPTCODE='20000000')AS O
GROUP BY O.CHEMICAL_ID,O.CAS,O.JC
效果如图
场景2
这里的化学品和类别也是一对多的关系,用到的多行转一列。
用到了 stuff(select ',' + fieldname from tablename for xml path('')),1,1,'') 函数
这一整句的作用是将多行fieldname字段的内容串联起来,用逗号分隔。
SELECT
qywhpglid ,typeName = ( STUFF(( SELECT ',' + typeName
FROM (
SELECT
a.QYWHPGL_ID AS qywhpglid,
g.DETAILS_NAME AS typeName
FROM
TB_HSE_FOUN_QYWHPGL a
INNER JOIN TB_BASE_CHEMICAL c ON a.WHPBM = c.CHECODE
INNER JOIN TB_BASE_CHEMICAL_TZLB f ON f.CHEMICAL_ID = c.CHEMICAL_ID
INNER JOIN TB_HSE_DICTIONARY_DETAILS g ON f.TZLBBM = g.DETAILS_CODE and g.ORGCODE='20000000'
WHERE
a.U_VALIDATE = '1'
)AS R
WHERE ==R.qywhpglid = Test.qywhpglid==
FOR XML PATH('')), 1, 1, '') )
FROM
(
SELECT
a.QYWHPGL_ID AS qywhpglid,
g.DETAILS_NAME AS typeName
FROM
TB_HSE_FOUN_QYWHPGL a
INNER JOIN TB_BASE_CHEMICAL c ON a.WHPBM = c.CHECODE
INNER JOIN TB_BASE_CHEMICAL_TZLB f ON f.CHEMICAL_ID = c.CHEMICAL_ID
INNER JOIN TB_HSE_DICTIONARY_DETAILS g ON f.TZLBBM = g.DETAILS_CODE and g.ORGCODE='20000000'
WHERE
a.U_VALIDATE = '1'
) AS Test
GROUP BY qywhpglid
注意:斜体加粗部分是两个表,它们的主键和要合并的行是一样的。如果不加上主键相等(标黄部分就会出现重复数据)
内容总结
以上是互联网集市为您收集整理的SqlServerl的行转列全部内容,希望文章能够帮你解决SqlServerl的行转列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。