我有一群经常变化的客户。每次群组更改时,都会将新客户的完整转储附加到表中并赋予新的 List_Name。Alpha、Beta、Gamma等。每个列表一般都会增加一些客户,删除一些客户,保留一些客户。我正在尝试创建一个简单的瀑布图来显示列表之间的变化。通常我只会 FULL OUTER JOIN Alpha<->Beta,然后 FULL OUTER JOIN Beta<->Gamma 等,以获取留下、离开和添加的客户。但是 List_Versions 增长了很多,我想知道是否有更简单的方法来执行此计算,而不是每次添加新列表时都必须对其进行编辑。我无法更改此流程,因为它支持旧系统并由另一个部门控制。想法?
编辑:Sql Server 2016 SP2。
CREATE TABLE #customers(cust_id int, list_name varchar(10), create_dt date)
INSERT INTO #customers values (1,'Alpha','2019-01-01')
,(2,'Alpha','2019-01-01')
,(3,'Alpha','2019-01-01')
,(4,'Alpha','2019-01-01')
,(5,'Alpha','2019-01-01')
,(2,'Beta','2019-03-01')
,(3,'Beta','2019-03-01')
,(4,'Beta','2019-03-01')
,(5,'Beta','2019-03-01')
,(6,'Beta','2019-03-01')
,(7,'Beta','2019-03-01')
,(1,'Gamma','2019-05-05')
,(6,'Gamma','2019-05-05')
,(7,'Gamma','2019-05-05')
,(9,'Gamma','2019-05-05')
--Desired Output (long way that needs to be edited every time there is a new list)
SELECT List_Name, 'Starting' Descrip, count(*) Custs FROM #customers WHERE list_name = 'alpha' group by list_name
UNION ALL
SELECT List_Name, 'Add', count(*) FROM #customers a WHERE list_name = 'Beta' AND not exists(SELECT * FROM #customers x WHERE List_Name = 'Alpha' AND a.cust_id = x.cust_id) GROUP BY List_Name
UNION ALL
SELECT 'Beta', 'Remove', -count(*) FROM #customers a WHERE list_name = 'Alpha' AND not exists(SELECT * FROM #customers x WHERE List_Name = 'Beta' AND a.cust_id = x.cust_id) GROUP BY List_Name
UNION ALL
SELECT List_Name, 'Add', count(*) FROM #customers a WHERE list_name = 'Gamma' AND not exists(SELECT * FROM #customers x WHERE List_Name = 'Beta' AND a.cust_id = x.cust_id) GROUP BY List_Name
UNION ALL
SELECT 'Gamma', 'Remove', -count(*) FROM #customers a WHERE list_name = 'Beta' AND not exists(SELECT * FROM #customers x WHERE List_Name = 'Gamma' AND a.cust_id = x.cust_id) GROUP BY List_Name