如何区分表中的2组记录

时间:2017-07-22 09:49:24

标签: sql sql-server sql-server-2016

请考虑此表:

ID       Code         Parent                        SomeInfo      Year
-----------------------------------------------------------------------
1        11100        00000/10000/11000             SomeInfo1      2016 
2        11101        00000/10000/11000/11100       SomeInfo2      2016 
3        11000        00000/10000                   SomeInfo3      2016 
4        12000        00000/10000                   SomeInfo4      2016 
5        12100        00000/10000/12000             SomeInfo5      2016 
6        11100        00000/10000/11000             SomeInfo6      2016 
7        11101        00000/10000/11000/11300       SomeInfo7      2017 
8        11000        00000/10000                   SomeInfo8      2017 
9        14100        00000/10000/14000             SomeInfo9      2017 
10       15100        00000/10000/15000             SomeInfo10     2017 
11       16100        00000/10000/16000             SomeInfo11     2017

父列是Top节点的路径(' 00000')

我有两个问题:

1)我如何根据年= 2016 来区分列。例如,在上面的示例中,代码= 11101 在年份中具有列的不同值: 2016& 2017

欲望输出是:

Code              Parent2016                   Parent2017
----------------------------------------------------------------
11101       00000/10000/11000/11100      00000/10000/11000/11300

2)如何获得 2017 中存在且 2016 中不存在的不同代码?

欲望输出是:

Code              Parent                   
-------------------------------
14100        00000/10000/14000    
15100        00000/10000/15000 
16100        00000/10000/16000

谢谢

2 个答案:

答案 0 :(得分:1)

对于您的第一个查询,您可以在代码列上汇总(GROUP BY),并保留2016和2017年具有两个不同父母的代码。

SELECT Code
FROM yourTable
WHERE Year IN (2016, 2017)
GROUP BY Code
HAVING COUNT(DISTINCT Parent) = 2

有很多方法可以回答你的第二个问题。我可能会使用的方法是根据您的表格中的2016年记录自行加入2017年的记录,然后检查2017年哪些前代码与2016年的任何内容不匹配。

SELECT
    t1.Code,
    t1.Parent
FROM yourTable t1
LEFT JOIN yourTable t2
    ON t1.Code = t2.Code AND
       t2.year = 2016
WHERE
    t1.year = 2017 AND
    t2.Code IS NULL

答案 1 :(得分:1)

您可以使用条件汇总

来转移2016/17年度的父母
max(case when year = 2016 then Parent else '' end) AS Parent2016

然后申请

HAVING Parent2016 <> Parent2017

导致

select code,
   max(case when year = 2016 then Parent else '' end) AS Parent2016, 
   max(case when year = 2017 then Parent else '' end) AS Parent2017 
from mytable
group by code
having 
   max(case when year = 2016 then Parent else '' end) <>
   max(case when year = 2017 then Parent else '' end)  

您的第二个问题只是转换为相关子查询:

select code, parent
from mytable as t1
where year = 2017
  and not exists
    ( select * from mytable as t2
      where year = 2016
        and t1.code = t2.code
    )