【发布时间】:2015-08-23 23:38:59
【问题描述】:
鉴于以下结构和数据,我正在寻找制造商发生变化的客户加入:
create table #sale (
saleid int,
customerid int,
productid int,
saledate date
);
create table #product (
productId int,
name varchar(max),
manufacturerId int
);
create table #manufacturer (
manufacturerid int,
name varchar(max)
)
insert into #manufacturer values (1, 'Manufacturer 1');
insert into #manufacturer values (2, 'Manufacturer 2');
insert into #product values (1, 'Product A', 1);
insert into #product values (2, 'Product B', 1);
insert into #product values (3, 'Product C', 2);
insert into #sale values (1, 101, 1, '2013-01-01');
insert into #sale values (2, 101, 2, '2015-04-01');
insert into #sale values (3, 102, 3, '2013-03-01');
insert into #sale values (4, 102, 3, '2015-01-01');
insert into #sale values (5, 103, 1, '2013-01-01');
insert into #sale values (6, 103, 3, '2015-06-01');
insert into #sale values (7, 102, 1, '2015-06-01');
在这种情况下,两个客户切换到不同制造商的产品,理想的结果如下所示:
customerid previous manufacturer new manufacturer date
102 Manufacturer 2 Manufacturer 1 6/1/2015
103 Manufacturer 1 Manufacturer 2 6/1/2015
我一直在尝试使用 CTE,但没有成功。欣赏和洞察力或指导。
更新 - 我可以忍受在 customerid 上水平扩展一定数量的连接以显示不同的制造商和日期(5-10 个连接)。对我来说,这比尝试使用 CTE 来 UNION ALL 容易得多。
谢谢!
【问题讨论】:
-
如果客户不止一次更换制造商怎么办。预期的结果是什么?另外,到目前为止,您尝试过什么 SQL?
-
@sstan 如果他们多次切换,它将显示为另一条记录。到目前为止,我认为我的 SQL 毫无价值。我正在考虑做几个派生表并加入它们以按客户显示所有不同的制造商和日期(最多 10 个不同的制造商更改,例如 102 | 制造商 1 | 2015 年 6 月 1 日 | 制造商 2 | 1/1 /2015)。这并不理想,但递归部分对我构成挑战,因为它不是我的强项。
标签: sql sql-server join recursive-query