2013-12-06 4 views
0

Суда ежедневно прибывают в порт с пассажирами «Р». Каждый корабль имеет название «N» и прибывает не чаще одного раза в день. У меня есть таблица этих данных таким образом:Присоединиться к той же таблице, что и даты встреч

Date   N   P 

2013-11-27 A   12 
2013-11-27 G   16 
2013-11-27 B   56 
2013-11-28 A   10 
2013-11-29 B   19 
2013-11-29 A   19 
2013-11-30 G   18 
2013-11-30 B   13 
2013-11-30 A   11 

Я хочу, чтобы сравнить одного корабля «А» количество пассажирского другого «B» для заданного промежутка времени, но только тогда, когда они прибывают в тот же день. Таким образом, результат равен

Date   PA  PB 

2013-11-27 12  56 
2013-11-29 19  19 
2013-11-30 11  13 

Обратите внимание, что нет «B» на 28-м, поэтому не сообщалось (и наоборот).

Какое-то внешнее соединение на одном столе?

SELECT A.Date, A.P as PA, B.P AS PB 
FROM Arrivals A OUTER JOIN Arrivals B ON A.Date = B.Date 
WHERE ... ??? 

Date >= @start AND Date <= @end AND 
A.N = 'A' AND B.N = 'B' 

Вышеуказанный запрос - это начало, которое я имею в виду, но я не знаю, как его завершить. Кто-нибудь знает запрос? SQL Server 2008 Спасибо за любую помощь.

+0

Пожалуйста, очистить свой вопрос здесь, на самом деле не уверен, что вы спрашиваете? Вы запрашиваете запрос, который даст результат, который вы указали в таблице? – Shawn

+0

Какая ошибка вы видите? Имеет ли значение '@ start' и' @ end' допустимое значение даты? Что вы ожидаете вместо '... ???'? –

ответ

1

Это работает?

SELECT A.Date, A.P as PA, B.P AS PB 
FROM (Select * FROM Arrivals WHERE N = 'A') A 
INNER JOIN (Select * FROM Arrivals WHERE N = 'B') B 
ON A.Date = B.Date 
+0

Я понятия не имею, на что вы ответили. –

+0

Да, да. Мне нужно больше думать о подзапросах. Спасибо, Йорг. – mac

0

попробовать это:

create table #tmp 
(
dt date, 
n varchar (1) , 
p int 
) 
GO 

insert into #tmp 
values 
('2013-11-27' , 'A'  , 12), 
('2013-11-27' , 'G' ,  16), 
('2013-11-27' , 'B'  , 56), 
('2013-11-28' , 'A' ,  10), 
('2013-11-29' , 'B' ,  19), 
('2013-11-29' , 'A' ,  19), 
('2013-11-30' , 'G' ,  18), 
('2013-11-30' , 'B' ,  13), 
('2013-11-30' , 'A' ,  11) 

GO 

select distinct 
a.dt, 
(select SUM(p) from #tmp y where y.dt = a.dt and y.n = 'A') pa, 
(select SUM(p) from #tmp y where y.dt = a.dt and y.n = 'B') pb, 
(select SUM(p) from #tmp y where y.dt = a.dt and y.n = 'G') pG 
from #tmp a 
group by a.dt, a.n 

Go 
drop table #tmp 
0
;WITH ARRIVAL_A AS 
(SELECT DATE, P FROM ARRIVALS WHERE N = 'A'), 
ARRIVAL_B AS 
(SELECT DATE, P FROM ARRIVALS WHERE N = 'B') 
SELECT ARRIVAL_A.DATE, ARRIVAL_A.P [PA], ARRIVAL_B.P [PB] 
FROM ARRIVAL_A INNER JOIN ARRIVAL_B 
ON ARRIVAL_A.DATE = ARRIVAL_B.DATE 
Смежные вопросы