2015-06-22 47 views
4

我需要加入2个表格,这对我来说是一个有趣的方式,请参阅下面的详细信息。表PROGRAMS按日期加入2个表格相交方式

STATION_INT | PROGRAM_NAME | AIR_DATE | START_TIME | END_TIME | SEQ_NUM 
======================================================================== 
      1  '70S SHOW ' 5/6/2015 32405000 32410000   1 
      1  '80S SHOW ' 5/6/2015 32415000 34300000   1 
........................................................................ 

也对我有第二个表Ratings

STATION_INT | IMP_DATE | IMP_START_TIME | IMP_END_TIME | IMP_STATUS | HH | F2_5 
================================================================================== 
     1  5/6/2015  32400000  34199000   S 1422 8464 
     1  5/6/2015  32400000  34199000   F 1677 9000 
     1  5/6/2015  34199000  34310000   S 1522 9160 
................................................................................... 

结果表(PROGRAMS * RATINGS)应该是这样的:

STATION_INT | PROGRAM_NAME | AIR_DATE | START_TIME | END_TIME | SEQ_NUM | IMP_DATE | IMP_START_TIME | IMP_END_TIME | HH_S | HH_F | F2_5_S | F2_5_F 
======================================================================================================================================================== 
     1  '70S SHOW ' 5/6/2015 32405000 32410000  1 5/6/2015   32400000  34199000 1422 1677  8464  9000  
     1  '80S SHOW ' 5/6/2015 32415000 34300000  1 5/6/2015   32400000  34310000 (1422+1522)/2 --- (8464+9160)/2 --- 

我不知道如何计算呢在SQL ...请告知

+2

请详细说明表格之间的行应该连接的条件。 – Deepshikha

+0

在第3行的“Ratings”表中,为什么IMP_START_TIME IMP_END_TIME – ughai

+1

有一个连接条件会有所帮助。哪个列应该按哪个逻辑连接?我没有看到相同的列。也许唯一的方法可能是使用imp_start_time的start_time和使用imp_end_time的end_time。但他们也不匹配。它背后是否有连接逻辑? – Ionic

回答

1

您可以像这样使用CROSS APPLY进行条件聚合。

查询

SELECT * 
FROM PROGRAMS as P 
CROSS APPLY (
SELECT 
    AVG(CASE WHEN R.IMP_STATUS = 'F' THEN HH END) as AVG_F_HH, 
    AVG(CASE WHEN R.IMP_STATUS = 'F' THEN F2_5 END) as AVG_F_F2_5, 
    AVG(CASE WHEN R.IMP_STATUS = 'S' THEN HH END) as AVG_S_HH, 
    AVG(CASE WHEN R.IMP_STATUS = 'S' THEN F2_5 END) as AVG_S_F2_5 
FROM Ratings as R 
WHERE R.IMP_DATE = P.AIR_DATE AND R.STATION_INT = P.STATION_INT 
AND NOT 
(R.IMP_START_TIME >= P.END_TIME OR P.START_TIME >= R.IMP_END_TIME) 
) as R 

输出

STATION_INT PROGRAM_NAME AIR_DATE START_TIME END_TIME SEQ_NUM AVG_F_HH AVG_F_F2_5 AVG_S_HH AVG_S_F2_5 
1 70S SHOW May, 06 2015 00:00:00 32405000 32410000 1 1677 9000 1422 8464 
1 80S SHOW May, 06 2015 00:00:00 32415000 34300000 2 1677 9000 1472 8812 

SQL Fiddle

+0

对我来说是一个奇妙的想法!只需要调整输出,对于HH_F/F2_5列,'row#2'应该包含'null' – SpanishBoy

+0

同样对于'row#2'应该不同于'row#1'结果 – SpanishBoy

+0

程序开始和结束时间'32400000' ,“34199000”与“评分”IMP_START_TIME和IMP_END_TIME重叠。这就是为什么第2行有'F'记录的值。你能解释为什么它应该是'空'吗? – ughai

1

由于我还没有100%确定的问题,我会尽我所能,与此回答。

SELECT p.station_int, p.program_name, p.air_date, p.start_Time, p.end_time, p.seq_Num, AVG(r.hh) 
FROM programs as p 
INNER JOIN ratings as r 
    ON r.imp_date = p.imp_date 
    AND (r.imp_start_time >= p.start_time 
     AND r.imp_start_time <= p.end_time) 
    AND (r.imp_end_time <= p.end_time 
     AND r.imp_end_time >= p.start_time) 
GROUP BY p.station_int, p.program_name, p.air_date, p.start_Time, p.end_time, p.seq_Num 

也许这会做你想找的东西。

+0

感谢您的建议! – SpanishBoy