请考虑此表:
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
谢谢
答案 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
)