起因 ?
今天歐陽冰提出一個報表需求,其核心部分可以簡化為這樣一張表格:
調度單號 | 與調度單相關的多張作業單號 |
001 | 0001/0002/0003 |
002 | 0004 |
003 | 0005/0006/0007/0008 |
從上述表格可以看出,如何把調度單的多行作業單明細的單號合并到同一行的一個字段中,并用斜杠 / 分隔,是這個需求的難點。
解決 ?
于是到網上去搜索了一下,有這樣一篇文章:
靈活運用 SQL SERVER FOR XML PATH
其中介紹了 SQL Server 數據庫的 FOR XML PATH 關鍵字的用法。
在一句 SELECT 語句的最后加上
FOR XML PATH
,就可以
把整個結果數據集變成一個 xml 字符串
。大家可以自行嘗試一下。
而如果使用
FOR XML PATH('')
,則是
去除所有 xml 節點標記,只剩下原原本本的數據
。我們要的就是這個。
于是,我們可以寫 SQL:
SELECT DH . DH_DISPATCH_NO DISPATCH_NO , ( SELECT CLH . CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL , TM_CARGO_LOAD_H CLH WHERE DH . BILLID = DCLL . BILLID AND DCLL . DCLL_CARGO_LOAD_HEADER_ID = CLH . BILLID FOR XML PATH ( '' ) ) NOS FROM TM_DISPATCH_H DH GROUP BY DH . BILLID , DH . DH_DISPATCH_NO ;
這樣就已經差不多了,但是多張作業單號這一列最后總是多個斜杠 /。
為了把最后這個斜杠去掉,我們還要使用一下 LEFT 函數。那么最終可以使用這樣一句 SQL 來滿足上述需求:
SELECT DISPATCH_NO , LEFT ( NOS , LEN ( NOS ) - 1 ) CARGO_LOAD_NOS FROM ( SELECT DH . DH_DISPATCH_NO DISPATCH_NO , ( SELECT CLH . CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL , TM_CARGO_LOAD_H CLH WHERE DH . BILLID = DCLL . BILLID AND DCLL . DCLL_CARGO_LOAD_HEADER_ID = CLH . BILLID FOR XML PATH ( '' ) ) NOS FROM TM_DISPATCH_H DH GROUP BY DH . BILLID , DH . DH_DISPATCH_NO ) TMP ORDER BY DISPATCH_NO ;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
