博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlServerl的行转列
阅读量:5301 次
发布时间:2019-06-14

本文共 1932 字,大约阅读时间需要 6 分钟。

目录

关键词:SqlServer

问题背景

  1. hql语句不熟悉,多表联查的时候都是在业务层在写其他的方法去查。(感觉真的好菜啊,但是还是要直面现实)。
  2. 测试的时候发现数据过滤的不对。有很多所谓的”重复"数据。以我项目中的两个场景为例。

场景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

在这里插入图片描述

注意:斜体加粗部分是两个表,它们的主键和要合并的行是一样的。如果不加上主键相等(标黄部分就会出现重复数据)

转载于:https://www.cnblogs.com/lyx32/p/10648061.html

你可能感兴趣的文章
Remainder
查看>>
Android:pressed状态下,改变背景和Text样式
查看>>
Spring层次图
查看>>
Unity3D学习笔记(三十一):Xlua(1)
查看>>
第一个C程序 (Blog测试)
查看>>
第一次实验报告
查看>>
删除文本文件行号的小方法(shell,sed)
查看>>
Boyer-Moore字符串查找算法的实现
查看>>
pandas.to_datetime() 只保留【年-月-日】
查看>>
org.apache.flume.FlumeException: NettyAvroRpcClient { host: xxx.xxx.xxx.xxx, port: 41100 }: RPC
查看>>
Composer学习之————Ubuntu14.04下安装Composer
查看>>
WorkerMan 入门学习之(三)基础教程-Timer类的使用
查看>>
pthreads 2.0.10 test
查看>>
iOS不显示状态栏(电池和信号栏)
查看>>
整理LVS架构压力测试工作
查看>>
信息安全导论-密码技术部分-读书笔记-1
查看>>
读书笔记-操作系统教程- 处理机管理-2
查看>>
判断回文联
查看>>
【转】什么是编码?
查看>>
PAT 1138 Postorder Traversal [比较]
查看>>