一.背景
今日接到一个需求,需要统计AB两个库中表的数据然后合并到一起。
需要查询的两个库的结构一致,所以同事只给了其中一个库的查询语句,剩下的查询整理需要自己写。
首先看一下原始的数据
原始取数语句
SELECT distinct ( ltrim(rtrim(a.charge_code))+‘,‘+ltrim(rtrim(a.serial))+‘,‘+ltrim(rtrim(a.group_no))) ASdrugMainKey,
a.drugnameASdrugCommName,
(case when isnull(y.drugname,‘‘)=‘‘ then a.drugname else y.drugname end) ASdrugName,
a.specificationASdrugspecs,
b.unitASdrugUnit,
e.dosanameASdrugFrom,
c.manu_nameASfactoryName ,
a.charge_codeAScharge_code,
a.serialASpackSeqNo,
a.group_noaspharmacyCode,
z.ybbmFROMyp_mz_base aLEFT JOIN yp_base f ON a.charge_code =f.charge_codeLEFT JOIN dbo.yp_unit b ON a.mini_unit =b.codeLEFT JOIN dbo.yp_manufacture c ON f.manufactory =c.manu_codeLEFT JOIN dbo.yp_dosage e ON f.dosage =e.dosacodeLEFT JOIN dbo.yp_drugname y ON a.drug_id_link = y.drug_id and y.flag =‘b‘
LEFT JOIN dbo.zd_ybdzyp z on a.charge_code=z.charge_code and a.serial=z.serial
(A库和B库查出来的数据结构一致,就不重复贴图了)
二.要求
①.对于A库查到的数据的字段drugmainkey的值末尾加‘1‘结尾,对于B库查到的数据的字段drugMainKey的值末尾加‘2’结尾,并且和原数据之间用‘,’分隔,将处理后的数据放在一起。
②.对于drugMainKey相同的行进行合并,合并后的drugname为各行的drugname的合集,用‘,’连接在一起。(因为除了drugname以外的其他字段值都是相同的,所以不需要做操作)
处理后的数据的效果图为:
这个问题可以用游标来操作,也可以用笨方法采取两步走的笨方法处理数据。
这里我用的是笨方法。
2.1.1先建立表一,用来存放①中的数据。
表一:
2.1.2 实现①的要求
这个没什么好说的,涉及到两个表用union all,以及字符串的拼接。
SELECT distinct ( ltrim(rtrim(a.charge_code))+‘,‘+ltrim(rtrim(a.serial))+‘,‘+ltrim(rtrim(a.group_no))+‘,‘+‘1‘) ASdrugMainKey,
a.drugnameASdrugCommName,
(case when isnull(y.drugname,‘‘)=‘‘ then a.drugname else y.drugname end) ASdrugName,
a.specificationASdrugspecs,ltrim(rtrim(b.unit)) ASdrugUnit,
e.dosanameASdrugFrom,
c.manu_nameASfactoryName ,
a.charge_codeAScharge_code,
a.serialASpackSeqNo,
a.group_noaspharmacyCode,
z.ybbm,
a.pack_sizeAS packSize, /*新增1*/
ltrim(rtrim(p.unit))AS drugUnit2 /*新增2*/
/*p.unit AS drugUnit2 新增2*/
FROMsdyychisdb_sz.dbo.yp_mz_base aLEFT JOIN sdyychisdb_sz.dbo.yp_base f ON a.charge_code =f.charge_codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit b ON a.mini_unit =b.codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit p ON a.pack_unit = p.code /*新增3*/
LEFT JOIN sdyychisdb_sz.dbo.yp_manufacture c ON f.manufactory =c.manu_codeLEFT JOIN sdyychisdb_sz.dbo.yp_dosage e ON f.dosage =e.dosacodeLEFT JOIN sdyychisdb_sz.dbo.yp_drugname y ON a.drug_id_link = y.drug_id and y.flag =‘b‘
LEFT JOIN sdyychisdb_sz.dbo.zd_ybdzyp z on a.charge_code=z.charge_code and a.serial=z.serialUNION all
SELECT distinct ( ltrim(rtrim(pa.charge_code))+‘,‘+ltrim(rtrim(pa.serial))+‘,‘+ltrim(rtrim(pa.group_no))+‘,‘+‘2‘) ASdrugMainKey,
pa.drugnameASdrugCommName,
(case when isnull(py.drugname,‘‘)=‘‘ then pa.drugname else py.drugname end) ASdrugName,
pa.specificationASdrugspecs,ltrim(rtrim(pb.unit)) ASdrugUnit,
pe.dosanameASdrugFrom,
pc.manu_nameASfactoryName ,
pa.charge_codeAScharge_code,
pa.serialASpackSeqNo,
pa.group_noaspharmacyCode,
pz.ybbm,
pa.pack_sizeAS packSize, /*新增1*/
ltrim(rtrim(pp.unit))AS drugUnit2 /*新增2*/
/*pp.unit AS drugUnit2 新增2*/
FROMsdyychisdb_pj.dbo.yp_mz_base paLEFT JOIN sdyychisdb_sz.dbo.yp_base pf ON pa.charge_code =pf.charge_codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit pb ON pa.mini_unit =pb.codeLEFT JOIN sdyychisdb_sz.dbo.yp_unit pp ON pa.pack_unit = pp.code /*新增3*/
LEFT JOIN sdyychisdb_sz.dbo.yp_manufacture pc ON pf.manufactory =pc.manu_codeLEFT JOIN sdyychisdb_sz.dbo.yp_dosage pe ON pf.dosage =pe.dosacodeLEFT JOIN sdyychisdb_sz.dbo.yp_drugname py ON pa.drug_id_link = py.drug_id and py.flag =‘b‘
LEFT JOIN sdyychisdb_sz.dbo.zd_ybdzyp pz on pa.charge_code=pz.charge_code and pa.serial=pz.serialorder by drugMainKey
2.2.1再建立表二,用来存放②中的数据。
表二
2.2.2代码实现②
selectB.drugMainKey,B.drugCommName,left(namelist,len(namelist)-1)as drugname,B.drugsecs,concat(B.packSize,B.drugUnit,‘/‘,B.drugUnit2)as drugUnit,B.drugFrom,B.factoryName,B.charge_code,B.packSeqNo,B.phamacyCode,B.ybbm,B.packSize,B.drugUnit2 from(selectdrugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2,
(select ltrim(rtrim(drugName))+‘,‘ fromxlyypwhere drugMainKey=A.drugMainKeyfor xml path(‘‘)) asnamelistfromxlyyp Agroup bydrugMainKey,drugCommName,drugsecs,drugUnit,drugFrom,factoryName,charge_code,packSeqNo,phamacyCode,ybbm,packSize,drugUnit2
)BORDER BY drugMainKey DESC
对于for xml path的用法的理解,可以参考另外一位园友的帖子。
https://www.cnblogs.com/yasuo2/p/6433697.html
原文:https://www.cnblogs.com/kingsgao/p/11720590.html