我有一个我无法正常工作的查询。我有3张桌子;人,人物图和类别。

Person: ID, ....    
PersonProgram: ID, PersonID, Category, Code ...    
Category: ID, ...

该人表有每个人的1个记录,并且人物计划每人有多个程序。有4个类别,我需要参与每个人的一行,每个类别的特定程序。

人表:

1
2
3

人体程序表

1, 1, 1, 1
2, 1, 2, 1
3, 1, 1, 3
4, 2, 1, 1
5, 2, 3, 3

所需的结果应该是什么:

PersonID, ProgramIDforCat1, ProgramIDforCat2, ProgramIDforCat3, ProgramIDforCat4
1, 1, 2, NULL, NULL
2, 1, NULL, 3, NULL

问题在于,每个人都有多个程序记录,并且具有1、2或3的代码。我需要在代码1上放置优先级,然后忽略其余的,而仍然只删除1个记录,或者如果是null,则为null它不存在。

我正在失去试图使它起作用。

仅供参考,它必须在某种程度上。

谢谢你的帮助。

有帮助吗?

解决方案

WITH Person AS
(
SELECT 1 AS ID UNION ALL
SELECT 2 AS ID UNION ALL
SELECT 3 AS ID
),
PersonProgram AS
(
SELECT 1 AS ID, 1 AS PersonID, 1 AS Category, 1 AS Code UNION ALL
SELECT 2, 1, 2, 1 UNION ALL
SELECT 3, 1, 1, 3 UNION ALL
SELECT 4, 2, 1, 1 UNION ALL
SELECT 5, 2, 3, 3
),
pp2 AS
(
SELECT *
,ROW_NUMBER() OVER 
 (PARTITION BY PersonID, Category 
      ORDER BY CASE WHEN Code = 1 THEN 0 ELSE 1 END,
               CASE WHEN Code = 3 THEN 0 ELSE 1 END) AS RN
 FROM PersonProgram
)
select PersonID ,
max(case when Category =1 then pp2.ID end) ProgramIDforCat1,
max(case when Category =2 then pp2.ID end) ProgramIDforCat2,
max(case when Category =3 then pp2.ID end) ProgramIDforCat3,
max(case when Category =4 then pp2.ID end) ProgramIDforCat4
from Person p join pp2 
on pp2.PersonID = p.ID
WHERE RN=1
group by PersonID

返回

PersonID    ProgramIDforCat1 ProgramIDforCat2 ProgramIDforCat3 ProgramIDforCat4
----------- ---------------- ---------------- ---------------- ----------------
1           1                2                NULL             NULL
2           4                NULL             5                NULL

这与您的预期结果不同。 (尽管我可以通过使用相同 pp2.Category 而不是 pp2.ID)你能澄清吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top