如何从两个不同的表中获取数据,如何将其链接到第三个表中的数据,以及在单个报表中获取所有内容?

问题描述

| 我在这里有点麻烦。我有两个不同的表,一个表存储特定横幅每天和每个用户在网站上的印象数,另一个表存储在给定日期向任何用户发送的电子邮件数。 有点像这样: 横幅广告 DATE USER_ID CLIENT_ID BANNER_ID IMPRESSIONS ________ _______ _________ ________ ___________ 2011年4月5日AX745 CC CC45 4 2011年4月5日AX745 KC KC66 1 2011年4月7日XY555 DP DP45 2 和: 电邮 DATE USER_ID EMAIL_ID CLIENT_ID ________ _______ ________ _________ 2011年4月5日AX745 EM001 CC 2011年4月5日AX745 EM005 BK 2011年4月7日XY555 EM008 DP 除了用户ID外,两个表都包含客户端ID和某种形式的日期信息。 我还需要引用客户端ID来获取实际的客户端名称,这些名称存储在第三个表中,如下所示: 客户 CLIENT_ID CLIENT _________ ________________________ CC可口可乐 肯德基KFC DP多米诺斯 BK汉堡王 我需要一个查询,该查询将按每个用户列表的每个日期返回,该用户对每个横幅有多少印象,以及哪个客户拥有该横幅,以及该用户当天发送了多少电子邮件,以及来自哪个客户。 大概是这样的: DATE USER_ID BANNER_CLIENT_ID BANNER_ID IMPRESSIONS EMAIL_ID EMAIL_CLIENT_ID ________ _______________________ _________ ___________ ________ _______________ 2011年4月5日AX745可口可乐CC45 4 EM001可口可乐 2011年4月5日AX745 EM005汉堡王 2011年4月5日AX745肯德基KC66 1 2011年4月7日XY555 DOMINOS DP45 2 EM008 DOMINOS 我可以分别获取每组信息没有问题,但是到目前为止,我还无法将所有数据合并到一个报表中。 任何帮助将不胜感激。 谢谢! C     

解决方法

下面的查询应为您提供所需的输出。
SELECT A.DATE,A.USER_ID,A.BANNER_ID,A.IMPRESSIONS,B.EMAIL_ID,C.CLIENT AS EMAIL_CLIENT_ID
FROM BANNERS A
LEFT JOIN EMAILS B ON A.CLIENT_ID=B.CLIENT_ID
LEFT JOIN CLIENTS C ON A.CLIENT_ID=C.CLIENT_ID
WHERE A.DATE=TO_DATE(\'04/07/11\',\'MM-DD-YY\')
    ,
Declare @impressions table
( [DATE]        date,[USER_ID]     varchar(10),[CLIENT_ID]   varchar(10),[BANNER_ID]   varchar(10),[IMPRESSIONS] int
)

Declare @ClientEmails table
( [DATE]        date,[EMAIL_ID]    varchar(10),[CLIENT_ID]   varchar(10)
)

Declare @Clients table
(  [CLIENT_ID]   varchar(10),[CLIENT]      varchar(50)
)   


Insert Into  @impressions ([DATE],[USER_ID],[CLIENT_ID],[BANNER_ID],[IMPRESSIONS])
Values (\'2011/04/05\',\'AX745\',\'CC\',\'CC45\',4),(\'2011/04/05\',\'KC\',\'KC66\',1),(\'2011/04/07\',\'XY555\',\'DP\',\'DP45\',2)


Insert Into  @ClientEmails ([DATE],[EMAIL_ID],[CLIENT_ID])
Values (\'2011/04/05\',\'EM001\',\'CC\'),\'EM005\',\'BK\'),\'EM008\',\'DP\')

Insert Into  @Clients([CLIENT_ID],[CLIENT])
Values (\'CC\',\'COCA-COLA\'),(\'KC\',\'KFC\'),(\'DP\',\'DOMINOS\'),(\'BK\',\'BURGER KING\')


Select isNull(imp.[DATE],eml.[DATE]) as [DATE],imp.[USER_ID],cli.[CLIENT] as [BANNER_CLIENT_ID],imp.[USER_ID] as [BANNER_ID],imp.[IMPRESSIONS],eml.[EMAIL_ID],emc.[CLIENT]  as [EMAIL_CLIENT_ID]
  from @impressions imp
  Left Join @Clients cli 
    on imp.[CLIENT_ID]=cli.[CLIENT_ID]
  Full outer Join @ClientEmails eml 
    on imp.[CLIENT_ID]=eml.[CLIENT_ID] 
   and imp.[USER_ID]=eml.[USER_ID]
   and imp.[DATE]=eml.[DATE]
  Left Join @Clients emc 
    on eml.CLIENT_ID=emc.CLIENT_ID  
 Order By [DATE]
    ,因为您既可以使用没有电子邮件的横幅,也可以使用没有横幅的电子邮件,那么您将需要使用FULL OUTER JOIN。
SELECT 
  nvl(A.DATE,b.date) as DATE,nvl(A.USER_ID,b.user_id) as USER_ID,c.client as banner_client_id,D.CLIENT AS EMAIL_CLIENT_ID
FROM 
  BANNERS A
  FULL OUTER JOIN EMAILS B ON (A.USER_ID=B.USER_ID AND 
                         a.DATE = b.DATE and
                         A.CLIENT_ID = B.CLIENT_ID)
  LEFT OUTER JOIN CLIENTS C ON (C.CLIENT_ID= a.CLIENT_ID)
  LEFT OUTER JOIN CLIENTS D ON (D.CLIENT_ID= B.CLIENT_ID)
完整的查询版本包括一些示例数据如下所示:
with banners as (
  select date \'2011-04-05\' as date_col,\'AX745\' as user_id,\'CC\' as client_id,\'CC45\' as banner_id,4 as impressions from dual union all
  select date \'2011-04-05\' as date_col,\'KC\' as client_id,\'KC56\' as banner_id,1 as impressions from dual union all
  select date \'2011-04-07\' as date_col,\'XY555\' as user_id,\'DP\' as client_id,2 as impressions from dual
),emails as (
  select date \'2011-04-05\' as date_col,\'EM001\' as email_id,\'CC\' as client_id from dual union all
  select date \'2011-04-05\' as date_col,\'EM005\' as email_id,\'BK\' as client_id from dual union all
  select date \'2011-04-07\' as date_col,\'EM008\' as email_id,\'DP\' as client_id from dual
),clients as (
  select \'CC\' as client_id,\'Coca-Cola\' as client_name from dual union all
  select \'KC\' as client_id,\'KFC\' as client_name from dual union all
  select \'DP\' as client_id,\'Dominos\' as client_name from dual union all
  select \'BK\' as client_id,\'Burger King\' as client_name from dual
)
select 
  nvl(A.DATE_col,b.date_col) as DATE_col,c.client_name as banner_client_id,D.CLIENT_name AS EMAIL_CLIENT_ID
from 
  banners a
  full outer join emails b on (A.USER_ID=B.USER_ID AND 
                         a.DATE_col = b.DATE_col and
                         A.CLIENT_ID = B.CLIENT_ID)
  left outer join clients c on (a.client_id = c.client_id)
  left outer join clients d on (b.client_id = d.client_id)