2016-02-26 61 views
0

我有两个表,一个包含项目列表,另一个包含此项目的请求。我想获得项目编号和请求记录。状态可以是:红色,黄色,绿色,打开如何根据此记录的值在一对多关系中获取单个记录

如何确保显示的1状态记录遵循以下逻辑:有红色时显示红色,当没有红色时但有一个黄色的节目这个黄色的等等...

;WITH 
numberTest as(
    SELECT dbo.ServiceRequest.ID as numId, 
    ROW_NUMBER() OVER (PARTITION BY dbo.ServiceRequest.Project_ID order by  Project_ID) AS RN1 
    FROM dbo.ServiceRequest   
), 

CTEVrequest AS 
(
    SELECT dbo.ServiceRequest.ID, dbo.ServiceRequest.Project_ID 
    FROM   dbo.ServiceRequest  
    LEFT JOIN numberTest ON numberTest.numId = dbo.ServiceRequest.ID 
    WHERE numberTest.RN1 = 1 
    AND 
    dbo.ServiceRequest.ID = CASE 

    WHEN EXISTS( 
    select srvReq.ID 
    from dbo.ServiceRequest as srvReq 
    where requestStatus.ServiceStatus = 'R' AND srvReq.Project_ID =  dbo.ServiceRequest.Project_ID) 
    THEN (select srvReq.ID 
    from dbo.ServiceRequest as srvReq 
    where requestStatus.ServiceStatus = 'R' AND srvReq.Project_ID =  dbo.ServiceRequest.Project_ID) 

    WHEN EXISTS( 
    select srvReq.ID 
    from dbo.ServiceRequest as srvReq 
    where requestStatus.ServiceStatus = 'Y' AND srvReq.Project_ID =  dbo.ServiceRequest.Project_ID) 
    THEN (select srvReq.ID 
    from dbo.ServiceRequest as srvReq 
    where requestStatus.ServiceStatus = 'Y' AND srvReq.Project_ID =  dbo.ServiceRequest.Project_ID) 
END) 

SELECT DISTINCT 
    dbo.Project.ProjectNumber, 
    dbo.Project.ID, 
    CTEVrequest.ServiceReqStatus, 
    CTEVrequest.ServiceStatus      
    FROM   dbo.Project 
    LEFT JOIN CTEVrequest ON CTEVrequest.Project_ID = dbo.Project.ID 
    LEFT JOIN  dbo.Project ON dbo.ServiceRequest.Project_ID = dbo.Project.ID 

的问题是我得到的“子查询返回多个值”错误,我不知道如何让检查的结果,如果有存在红色的记录,如果没有选择黄色的记录等等。

+1

这里是一个开始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

其他人可能无法理解/读取总代码,所以最好的方法是阅读链接张贴上面sean – TheGameiswar

+0

进一步,一个地方,你可以看到额外的列是(选择srvReq.ID ...添加选择顶部1 srvReq.ID可以工作,但它不会给你你需要的结果 – TheGameiswar

回答

1

也许我不明白你的权利,但看起来像你的查询应该这样做:

SELECT * 
FROM dbo.Project p 
OUTER APPLY 
(
    SELECT TOP 1 sr.* 
    FROM dbo.ServiceRequest sr 
    WHERE sr.Project_ID = p.Project_ID 
     /* AND sr.ServiceStatus in ('R', 'Y') */ 
    ORDER BY 
     CASE 
     WHEN sr.ServiceStatus = 'R' THEN 1 
     WHEN sr.ServiceStatus = 'Y' THEN 2 
     ELSE 3 
     END 
) sr 
+0

谢谢这个作品完美 – Jelle

0

为什么不创建一个用作状态键的表?例如:

IF OBJECT_ID('tempdb..#LevelKey') IS NOT NULL 
    DROP TABLE #LevelKey; 

CREATE TABLE #LevelKey 
    (LevelText [varchar](255), 
    LevelValue INT); 

INSERT INTO #LevelKey VALUES 
    ('Red',1), 
    ('Orange',2), 
    ('Yellow',3), 
    ('Green',4); 

现在,将项目级别加入此项。当你想获得最高等级时,你可以做如下事情:

SELECT TOP 1 * 
FROM Table 
INNER JOIN #LevelKey ON LevelText = Whatever 
ORDER BY LevelValue ASC 

但是,这只适用于一个。所以我甚至不确定为什么包括这个。带回一组,你将不得不做这样的事情:

SELECT ProjectID, MAX(LevelValue) AS LevelValue 
FROM Table 
INNER JOIN #LevelKey ON LevelText = Whatever 
GROUP BY ProjectID 
相关问题