0

正しく動作しないクエリがあります。3 つのテーブルがあります。人物、人物プログラム、およびカテゴリ。

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

Person テーブルには各人物に対して 1 つのレコードがあり、PersonProgram には 1 人につき複数のプログラムがあります。4 つのカテゴリがあり、各カテゴリの特定のプログラムを使用して、各人物を 1 行にまとめる必要があります。

人物表:

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 を優先し、次にコード 3 を優先して残りを無視する必要があります。それは存在しない。

これを機能させようとして、私はそれを失っています。

参考までに、それはビューにある必要があります。

助けてくれてありがとう。

4

1 に答える 1

1
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できますが) 明確にできますか?

于 2010-08-20T22:53:07.607 に答える