2014-10-10 56 views
0

反饋表是這樣的加入與CommonTable表達 - SQL

URL   DeveloperStatus ReviewerStatus 
--------------------------------------------------------- 
default.aspx Open     Closed 
default.aspx Open     Open 
Pages.aspx  Closed    Open 
Pages.aspx  Open     Closed 
Pages.aspx  Closed    Closed 

的每個網址都可以多次列出其DStatus & RSTATUS可以開啓/關閉無關的對方的身份

我會想要列出的總結是這樣的:

URL   DeveloperStatus ReviewerStatus 
--------------------------------------------------------- 
default.aspx Open     Open 
Pages.aspx  Open     Open 

如果網址中有ATLEAST一個DeveloperStatus爲打開,那麼它應該是開放的。 ReveiwerStatus也一樣。

這是我的工作代碼。我該如何改進:

;WITH TBL1 AS 
(
SELECT URL, DeveloperStatus, 
     ROW_NUMBER() OVER (PARTITION BY URL ORDER BY DeveloperStatus DESC) AS rn 
FROM Feedback 
) 
,TBL2 AS 
(
SELECT URL, ReviewerStatus, 
     ROW_NUMBER() OVER (PARTITION BY URL ORDER BY ReviewerStatus DESC) AS rn 
FROM Feedback 
) 
SELECT DISTINCT f.URL,TBL1.DeveloperStatus,TBL2.ReviewerStatus FROM Feedback f 
LEFT JOIN TBL1 ON f.URL = TBL1.URL AND TBL1.rn=1 
LEFT JOIN TBL2 ON f.URL = TBL2.URL AND TBL2.rn=1 

回答

0

你可以這樣做..它只允許兩種狀態,打開和關閉。

SELECT DISTINCT 
     URL 
     ,DeveloperStatus = CASE WHEN EXISTS (SELECT 1 FROM Feedback x WHERE x.URL = f.URL and x.DeveloperStatus = 'Open') THEN 'Open' ELSE 'Closed' END 
     ,ReviewerStatus = CASE WHEN EXISTS (SELECT 1 FROM Feedback x WHERE x.URL = f.URL and x.ReviewerStatus = 'Open') THEN 'Open' ELSE 'Closed' END 
FROM Feedback f 

也可以這樣做:

CREATE TABLE dbo.FeedBack (
    URL VARCHAR(30) 
    ,DeveloperStatus VARCHAR(20) 
    ,ReviewerStatus VARCHAR(20) 
    ); 

SET NOCOUNT ON; 

INSERT INTO dbo.FeedBack (URL, DeveloperStatus, ReviewerStatus) 
    SELECT 'default.aspx' AS URL, 'Open' AS DeveloperStatus,     'Closed' AS ReviewerStatus 
    UNION ALL 
    SELECT 'default.aspx', 'Open',     'Open' 
    UNION ALL 
    SELECT 'Pages.aspx',  'Closed',    'Open' 
    UNION ALL 
    SELECT 'Pages.aspx',  'Open',     'Closed' 
    UNION ALL 
    SELECT 'Pages.aspx',  'Closed',    'Closed' 

SELECT DISTINCT 
     f.URL 
     ,DeveloperStatus = ISNULL(df.DeveloperStatus,f.DeveloperStatus) 
     ,ReviewerStatus = ISNULL(rf.ReviewerStatus, f.ReviewerStatus)  
FROM FeedBack f 
LEFT JOIN FeedBack df ON f.URL = df.URL and df.DeveloperStatus = 'Open' 
LEFT JOIN FeedBack rf ON f.URL = rf.URL and rf.ReviewerStatus = 'Open' 


DROP TABLE FeedBack 
1

如果我沒有誤解你的問題。我可以用聚合來完成。

select Url, Max(DeveloperStatus), Max(ReviewerStatus) 
from YourTable 
Group by Url