2017-04-06 69 views
0

我想在SQL中加入两个表格并且结果显示表格1的值,其中表格2中没有匹配。SQL Server查询 - 加入表格以显示其中一个不存在的内容

实施例:

表1

Person |January|February|March|April| May|June|July|August|September|October|November|December| 
Person 1|  1|  2| 3| 4| 5| 6| 7|  8|  9|  10|  11|  12| 
Person 2|  1|  2| 3| 4| 5| 6| 7|  8|  9|  10|  11|  12| 
Person 3|  1|  2| 3| 4| 5| 6| 7|  8|  9|  10|  11|  12| 

表2

Person |Month| 
Person 1| 1| 
Person 1| 3| 
Person 1| 5| 
Person 1| 7| 
Person 1| 9| 
Person 1| 11| 
Person 2| 2| 
Person 2| 4| 
Person 2| 6| 
Person 2| 8| 
Person 2| 10| 
Person 2| 12| 
Person 3| 1| 
Person 3| 2| 
Person 3| 3| 
Person 3| 4| 
Person 3| 5| 
Person 3| 6| 
Person 3| 7| 
Person 3| 8| 
Person 3| 9| 
Person 3| 10| 
Person 3| 11| 
Person 3| 12| 

所需的结果

Person |January|February|March|April| May|June|July|August|September|October|November|December| 
Person 1| NULL|  2| NULL| 4|NULL| 6|NULL|  8|  NULL|  10| NULL|  12| 
Person 2|  1| NULL| 3| NULL| 5|NULL| 7| NULL|  9| NULL|  11| NULL| 
Person 3| NULL| NULL| NULL| NULL|NULL|NULL|NULL| NULL|  NULL| NULL| NULL| NULL| 

所以你可以看到,在表2中,1人只有ODD个月,这样的人应该都显示在结果中甚至从表1月起在表2

不存在这些个月

在此先感谢!

+0

你需要在这里什么是逆透视表1,因此在相同的标准化结构,表2,那么基本的左连接会做到这一点。 https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

回答

0

我不知道是什么表1的目的是在这里。下面是对表2的查询,它会告诉你一个人在几个月的时间。这个用1表示是,0表示没有。我建议不要使用NULL,因为它应该只显示缺少信息。在这种情况下,我们确认该人未在该月份上市。我也不确定为什么你想发布2月2日和3月3日,当列名将调出你正在引用的月份。

DECLARE @Table2 TABLE (
Person VARCHAR(MAX) 
,[Month] INT 
) 

INSERT @Table2 VALUES 
('Person1',1) 
,('Person1',3) 
,('Person1',5) 
,('Person1',7) 
,('Person1',9) 
,('Person1',11) 
,('Person2',2) 
,('Person2',4) 
,('Person2',6) 
,('Person2',8) 
,('Person2',10) 
,('Person2',12) 
,('Person3',1) 
,('Person3',2) 
,('Person3',3) 
,('Person3',4) 
,('Person3',5) 
,('Person3',6) 
,('Person3',7) 
,('Person3',8) 
,('Person3',9) 
,('Person3',10) 
,('Person3',11) 
,('Person3',12) 

SELECT 
    Person 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 1) THEN 1 ELSE 0 
     END AS January 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 2) THEN 1 ELSE 0 
     END AS February 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 3) THEN 1 ELSE 0 
     END AS March 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 4) THEN 1 ELSE 0 
     END AS April 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 5) THEN 1 ELSE 0 
     END AS May 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 6) THEN 1 ELSE 0 
     END AS June 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 7) THEN 1 ELSE 0 
     END AS July 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 8) THEN 1 ELSE 0 
     END AS August 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 9) THEN 1 ELSE 0 
     END AS September 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 10) THEN 1 ELSE 0 
     END AS October 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 11) THEN 1 ELSE 0 
     END AS November 
    ,CASE 
     WHEN Person IN (SELECT Person FROM @Table2 WHERE [Month] = 12) THEN 1 ELSE 0 
     END AS December 
FROM @Table2 
GROUP BY 
    [Person] 
+0

谢谢!我会明天看到这第一件事,并让你知道。 –

+0

非常好!你是对的,表1是不需要的。谢谢。 –

0

以下是使用数据透视表的解决方案。第一个cte(称为Months)只是从1到12列表。第二个cte为您的Table2创建一个等效项。为了获得所有的月份,不在表2中,将第一个cte与table2交叉连接,然后除了table2中的值。

然后转动......

;With Months AS 
(
SELECT 1 AS Level 
UNION ALL 
SELECT Level + 1 FROM Months 
WHERE Level < 12 
) 
,cte AS 
(
SELECT 'Person1' [Person],1 [Month] 
UNION SELECT 'Person1',3 
UNION SELECT 'Person1',5 
UNION SELECT 'Person1',7 
UNION SELECT 'Person1',9 
UNION SELECT 'Person1',11 
UNION SELECT 'Person2',2 
UNION SELECT 'Person2',4 
UNION SELECT 'Person2',6 
UNION SELECT 'Person2',8 
UNION SELECT 'Person2',10 
UNION SELECT 'Person2',12 
UNION SELECT 'Person3',1 
UNION SELECT 'Person3',2 
UNION SELECT 'Person3',3 
UNION SELECT 'Person3',4 
UNION SELECT 'Person3',5 
UNION SELECT 'Person3',6 
UNION SELECT 'Person3',7 
UNION SELECT 'Person3',8 
UNION SELECT 'Person3',9 
UNION SELECT 'Person3',10 
UNION SELECT 'Person3',11 
UNION SELECT 'Person3',12 
) 
Select * from 
(
    Select Distinct Person, Level [Month] FROM cte 
    CROSS JOIN Months 
    EXCEPT 
    Select Person, Month from cte 
) a 
Pivot(MAX(Month) For Month in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) Pvt 
+0

对不起,这个答案是静态的。如果我有5万人呢? –

+0

不是静态的。将第二个cte定义替换为一个查询,根据需要选择尽可能多的人... eg.',cte as(选择Person,Month from sometable)...' –

相关问题