好吧我找到了解决方案。欢迎您完善并添加您的想法。动态命名列会很方便。 (即产品1,产品2,产品3,产品4)
架构
create table Purchase
(
pid int,
purchasedate date,
currency varchar(10),
paymenttype varchar(10),
creditcard varchar(10),
creditcardtype varchar(10)
);
create table Hotel
(
hid int,
pid int,
product varchar(30),
country varchar(10),
city varchar(10),
rooms int,
starrating int
);
create table Car
(
cid int,
pid int,
product varchar(30),
country varchar(10),
city varchar(10),
cancel int,
starrating int
);
insert into Purchase values (1, '2015-01-15','AUD', 'CC','12345678','AMEX')
insert into Purchase values (2, '2015-01-15','AUD', 'CC','12345678','AMEX')
insert into Purchase values (3, '2015-01-15','AUD', 'CC','12345678','AMEX')
insert into Purchase values (4, '2015-01-15','AUD', 'CC','12345678','AMEX')
insert into Purchase values (5, '2015-01-15','AUD', 'CC','12345678','AMEX')
insert into Hotel values (1,1, 'Five for Two','Australia', 'Melbourne','1','3')
insert into Hotel values (2,1, 'Five for None','Australia', 'Sydney','1','3')
insert into Hotel values (3,1, 'Five for Five','Australia', 'Melbourne','1','3')
insert into Hotel values (4,1, 'Five for Two','Australia', 'Jamboora','1','3')
insert into Hotel values (5,2, 'Five for Three','Australia', 'Sydney','1','3')
insert into Hotel values (6,2, 'Five for Love','Australia', 'Cook','1','3')
insert into Hotel values (7,2, 'Five for Grease','Australia', 'Darwin','1','3')
insert into Hotel values (8,3, 'Love Me','Australia', 'Darwin','1','3')
insert into Hotel values (9,4, 'Live for Grease','Australia', 'Footscray','1','3')
insert into Hotel values (10,4, 'Love Grease','Australia', 'Officer','1','3')
insert into Car values (1,1, 'Love Grease','Australia', 'Officer','1','3')
insert into Car values (2,2, 'Love Grease','Australia', 'Cook','1','3')
insert into Car values (3,4, 'Live Grease','Australia', 'Jamboora','1','3')
-- For Advance insert into Car values (4,4, 'Cove Grease','Australia', 'Melbourne','1','3')
而且代码
SELECT *, DENSE_RANK() OVER(PARTITION BY pid ORDER BY hid DESC) AS Ranking
INTO #TempHotel
FROM Hotel
SELECT P.pid, P.purchasedate, P.currency, P.paymenttype, P.creditcard, P.creditcardtype
,C.cid, C.product, C.country, C.city, C.cancel, C.starrating
,H1.hid, H1.product, H1.country, H1.city,H1.rooms,H1.starrating
,H2.hid, H2.product, H2.country, H2.city,H2.rooms,H2.starrating
,H3.hid, H3.product, H3.country, H3.city,H3.rooms,H3.starrating
,H4.hid, H4.product, H4.country, H4.city,H4.rooms,H4.starrating
FROM Purchase P
left join Car C on P.pid = C.pid
left join #TempHotel H1 on P.pid = H1.pid and H1.Ranking = 1
left join #TempHotel H2 on P.pid = H2.pid and H2.Ranking = 2
left join #TempHotel H3 on P.pid = H3.pid and H3.Ranking = 3
left join #TempHotel H4 on P.pid = H4.pid and H4.Ranking = 4
DROP Table #TempHotel
您还可以在SQL小提琴Here找到。
你试过了什么?你可以向你展示查询和你在哪堆栈? – Fabio
我尝试了一些东西,但没有成功,甚至没有接近卡住。 http://sqlfiddle.com/#!3/832f1/16是我得到的最接近的,但我有30列复制不只是一个,事实上,我有一种感觉,PIVOT是不是要走的路。我使用DENSE_RANK()或类似的东西'选择PID OVER(ORDER BY PID) 思考,HID,DENSE_RANK()从酒店 WHERE PID IN(SELECT PID从酒店 其中PID IN(SELECT PID自购买WHERE rdate BETWEEN'2014-04-01'和'2014-12-31' ) GROUP BY pid HAVING COUNT(pid)> 1)' – Udaan