1. 程式人生 > 其它 >SQL 邏輯配置表連線業務表時用到的技巧。(報表拆分,*號處理,排斥處理)

SQL 邏輯配置表連線業務表時用到的技巧。(報表拆分,*號處理,排斥處理)

業務背景:

在財務領域或者營銷領域,常常存在多種費用項,這些費用項的判斷標準可能就就是那兩個欄位,但一個欄位裡面的值可能存在全部,某個,多個的情況。因此在開發相對應的費用項報表的時候,需要開發邏輯配置表然後關聯業務表。

這樣後期維護只需要維護邏輯配置表就可以了。

邏輯配置表:

業務表:

最終處理結果:

涉及程式碼

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'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 費用項