SqlServerl的行轉列


關鍵詞: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

在這里插入圖片描述
注意:斜體加粗部分是兩個表,它們的主鍵和要合並的行是一樣的。如果不加上主鍵相等(標黃部分就會出現重復數據)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM