繁体   English   中英

如何做空联接

[英]How to do left join with nulls

我正在尝试进行自我联接并减去同一列的值。

--sum of all pageviews of circleid 0 of each device category - (sum of all 
--pageviews of circleid <> 0 of each device category)

现有表格-gadata:

PageName    DeviceCategory  FKCircleId  FKGAFilterKeyID PageViews
login       desktop         0            5              10
login       desktop         0            5              20
login       mobile          0            5              5
login       tablet          0            5             15
login       desktop         1            4              2
login       desktop         1            4              2
login       mobile          1            4              3
login       tablet          1            4              4

所需的o / p:

PageName    DeviceCategory  PageViews
login       desktop         26 --(30-4)
login       mobile           2 --(5-3)
login       tablet           11 --(15-4)

但是这个查询给我空值

PageName DeviceCategory Circle  Total   
Login    desktop    NULL    NULL
Login    mobile     NULL    NULL
Login    tablet     NULL    NULL

CREATE TABLE gadata(PageName varchar(10),DeviceCategory 
varchar(10),FKCircleId int, FKGAFilterKeyID int,PageViews int)
insert into gadata values('login','desktop',0,5,10)
insert into gadata values('login','desktop',0,5,20)
insert into gadata values('login','mobile',0,5,5)
insert into gadata values('login','tablet',0,5,15)
insert into gadata values('login','desktop',1,4,2)
insert into gadata values('login','desktop',1,4,2)
insert into gadata values('login','mobile',1,4,3)
insert into gadata values('login','tablet',1,4,4)

    ;WITH TBL3 AS(      
    SELECT gd.PageName,gd.DeviceCategory,'All' AS Circle,
           SUM(gd.PageViews) AS Total1,gd.FKGAFilterKeyID
    FROM gadata(NOLOCK) gd          
    WHERE gd.FKGAFilterKeyID =5     
    GROUP BY gd.PageName,gd.DeviceCategory,gd.FKGAFilterKeyID
    ),
    TBL4 AS(        
    SELECT gd.PageName,gd.DeviceCategory,'Other' AS t4Circle,
           ISNULL(SUM(gd.PageViews),0) AS Total2,gd.FKGAFilterKeyID
    FROM gadata(NOLOCK) gd      
    WHERE gd.FKGAFilterKeyID <> 5       
    GROUP BY gd.PageName,gd.DeviceCategory,gd.FKGAFilterKeyID
    )
    SELECT t3.PageName,t3.DeviceCategory,t4.t4Circle AS Circle,
           (t3.Total1-t4.Total2) AS Total
    FROM TBL3 t3
    LEFT JOIN TBL4 t4 ON t3.FKGAFilterKeyID = t4.FKGAFilterKeyID 
AND t3.DeviceCategory= t4.DeviceCategory

当我分别在tbl3和tbl4中运行subQueries时,我得到了数据。 我要去哪里错了。

sqlfiddle无法正常工作。 我会拨弄小提琴的。

您加入了不正确的列。 当在TBL4找不到匹配的行时,也请使用ISNULL函数以免获得NULL

SELECT t3.PageName,t4.t4Circle AS Circle,
       (t3.Total1-ISNULL(t4.Total2, 0)) AS Total
FROM TBL3 t3
LEFT JOIN TBL4 t4 ON t3.PageName = t4.PageName AND t4.DeviceCategory = t3.DeviceCategory

输出:

PageName    Circle  Total
login       Other   26
login       Other   2
login       Other   11

我删除了AccessType列,因为它不在创建脚本中。

编辑:

我也不知道您的逻辑,但是如果您可以在TBL3中包含不在TBL3值(例如login, windows phone, 1, 10 TBL4 ),则可以使用FULL OUTER JOIN

insert into gadata values('login','win. phone',1,10,6)

SELECT ISNULL(t3.PageName, t4.PageName) AS PageName,t4.t4Circle AS Circle,
       (ISNULL(t3.Total1, 0)-ISNULL(t4.Total2, 0)) AS Total
FROM TBL3 t3
FULL JOIN TBL4 t4 ON t3.PageName = t4.PageName AND t4.DeviceCategory = t3.DeviceCategory

输出:

PageName    Circle  Total
login       Other   52
login       Other   4
login       Other   22
login       Other   -6

代替有问题的长查询,仅使用self join

select tbl1.pagename, tbl1.devicecategory, tbl1.pageviews - tbl2.pageviews
from (select t2.pagename, t2.devicecategory, sum(t2.pageviews) as pageviews
       from gadata t2
       where t2.FKCircleId=0 
       group by t2.pagename, t2.devicecategory) tbl1
join (select t3.pagename, t3.devicecategory, sum(t3.pageviews) as pageviews
       from gadata t3
       where t3.FKCircleId <> 0 
       group by t3.pagename, t3.devicecategory) tbl2
on tbl1.pagename=tbl2.pagename and tbl1.devicecategory=tbl2.devicecategory

OUTPUT:

login       desktop         26 
login       mobile           2 
login       tablet           11 

SQLFIDDLE演示

WITH cte1 
AS
(SELECT [PageName],[DeviceCategory],sum([PageViews]) smx
FROM [dbo].[gadata]
WHERE [FKCircleId]=0
GROUP BY [PageName],[DeviceCategory])
,cte2
AS
(SELECT [PageName],[DeviceCategory],sum([PageViews]) smx1
FROM [dbo].[gadata]
WHERE [FKCircleId]!=0
GROUP BY [PageName],[DeviceCategory])
--SELECT * FROM cte1
SELECT c1. [PageName],c1.[DeviceCategory],smx-smx1 as Total
FROM cte2 AS c2 JOIN cte1 AS c1
ON c2.[DeviceCategory]=c1.[DeviceCategory]

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM