Sql 加入到相同的表匹配日期范围

Sql 加入到相同的表匹配日期范围,sql,sql-server-2008,date,join,Sql,Sql Server 2008,Date,Join,船舶每天都有“p”乘客到达港口。每艘船都有一个名字“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-3

船舶每天都有“p”乘客到达港口。每艘船都有一个名字“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
我想在给定的时间跨度内比较一艘船的“A”乘客数和另一艘船的“B”乘客数,但仅当他们在同一天到达时。所以结果是

Date          PA        PB

2013-11-27    12        56
2013-11-29    19        19
2013-11-30    11        13
注28日无“B”,因此未报告(反之亦然)

同一个表上的某种外部联接

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'
选择A.日期,A.P作为PA,B.P作为PB
从到达A外部连接到达B在A.日期=B.日期
哪里
日期>=@start和Date这行吗

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
试试这个:

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

请澄清你的问题,不确定你在问什么?您是否正在请求将给出表中列出的结果的查询?您看到了什么错误?
@start
@end
是否具有有效的日期值?你期望什么而不是
?我不知道你回答了什么。是的。我需要更多地考虑子查询。谢谢你,乔。
;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