Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 优先查询_Sql Server 2005_Sql View - Fatal编程技术网

Sql server 2005 优先查询

Sql server 2005 优先查询,sql-server-2005,sql-view,Sql Server 2005,Sql View,我有一个问题,我无法正常工作。我有三张桌子;人员、人员计划和类别 Person: ID, .... PersonProgram: ID, PersonID, Category, Code ... Category: ID, ... Person表中每个人有一条记录,PersonProgram中每个人有多个程序。有4个类别,我需要拉到一行,每个人,每个类别的具体方案 人员表: 1 2 3 个人程序表 1, 1, 1, 1 2, 1, 2, 1 3, 1, 1, 3 4, 2,

我有一个问题,我无法正常工作。我有三张桌子;人员、人员计划和类别

Person: ID, ....    
PersonProgram: ID, PersonID, Category, Code ...    
Category: ID, ...
Person表中每个人有一条记录,PersonProgram中每个人有多个程序。有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上设置优先级,然后在代码3上设置优先级,并忽略其余部分,同时仍然只提取1条记录,如果它不存在,则为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
来实现同样的效果)您能澄清一下吗?

我的示例中的结果可能是错误的,这个查询太长了。我会看看这个,看起来很有希望。星期五的退出时间:)是否可以在视图中使用
ROW\u NUMBER
?如果我加上它,SSMS每次都会崩溃。使用SQL 2005。@durilai-Yes。如果设计人员无法处理此问题,请尝试通过脚本
创建视图dbo.ViewName AS和pp2 AS…
执行此操作是最好的方法,视图工作正常,但设计人员失败了。别在乎这个。谢谢,比我想的要优雅得多。