SQL 邏輯配置表連線業務表時用到的技巧。(報表拆分,*號處理,排斥處理)
阿新 • • 發佈:2021-12-01
業務背景:
在財務領域或者營銷領域,常常存在多種費用項,這些費用項的判斷標準可能就就是那兩個欄位,但一個欄位裡面的值可能存在全部,某個,多個的情況。因此在開發相對應的費用項報表的時候,需要開發邏輯配置表然後關聯業務表。
這樣後期維護只需要維護邏輯配置表就可以了。
邏輯配置表:
業務表:
最終處理結果:
涉及程式碼
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[邏輯配置表]') AND type IN ('U')) DROP TABLE [dbo].[邏輯配置表] GOCREATE TABLE [dbo].[邏輯配置表] ( [費用項] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [品牌] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [國家] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL ) GO ALTER TABLE [dbo].[邏輯配置表] SET (LOCK_ESCALATION = TABLE) GO -- ---------------------------- -- Records of 邏輯配置表-- ---------------------------- INSERT INTO [dbo].[邏輯配置表] ([費用項], [品牌], [國家]) VALUES (N'001', N'A', N'P') GO INSERT INTO [dbo].[邏輯配置表] ([費用項], [品牌], [國家]) VALUES (N'002', N'A,B', N'P') GO INSERT INTO [dbo].[邏輯配置表] ([費用項], [品牌], [國家]) VALUES (N'003', N'*', N'P,X') GO INSERT INTO [dbo].[邏輯配置表] ([費用項], [品牌], [國家]) VALUES (N'004', N'-A,-B', N'*') GO
業務表
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[業務表]') AND type IN ('U')) DROP TABLE [dbo].[業務表] GO CREATE TABLE [dbo].[業務表] ( [品牌] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [國家] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [銷售額] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL ) GO ALTER TABLE [dbo].[業務表] SET (LOCK_ESCALATION = TABLE) GO -- ---------------------------- -- Records of 業務表 -- ---------------------------- INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'A', N'P', N'100') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'B', N'P', N'101') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'C', N'P', N'102') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'D', N'P', N'103') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'A', N'X', N'104') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'C', N'X', N'105') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'D', N'X', N'106') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'B', N'y', N'107') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'C', N'X', N'108') GO INSERT INTO [dbo].[業務表] ([品牌], [國家], [銷售額]) VALUES (N'D', N'X', N'109') GO
執行邏輯參考
with t1 as ( select * from 業務表 ) , t11 as (select distinct 國家 ,'*'國家連線符 from 業務表) , t12 as (select distinct 品牌,'*'品牌連線符 from 業務表 union all select distinct b.品牌,'-'+a.品牌 品牌連線符 from 業務表 a , 業務表 b where a.品牌 <> b.品牌 ) , t2 as ( select t.費用項 ,v.value 國家 ,w.value 品牌 from 邏輯配置表 t cross apply String_split(t.國家 , ',') v cross apply String_split(t.品牌 , ',') W ) , t3 as ( select distinct 費用項,isnull(b.國家,a.國家) 國家 , isnull(c.品牌 , a.品牌) 品牌 from t2 a left join t11 b on a.國家 = b.國家連線符 left join t12 c on a.品牌 = c.品牌連線符 ) select a.費用項,sum(b.銷售額*1) 銷售額 from t3 a left join t1 b on a.國家= b.國家 and a.品牌 = b.品牌 group by 費用項