2015-11-04 210 views
2

我有一個SQL Server上的表2008 R2數據庫:選擇從表中篩選的記錄與複合主鍵

 
╔══════════════════════════╦══════════════╦══════════╗ 
║  Team Name   ║ Project Code ║ Actioned ║ 
╠══════════════════════════╬══════════════╬══════════╣ 
║ DC & Facilities Services ║ ZZ794419  ║ No  ║ 
║ DC & Facilities Services ║ ZZ794419  ║ Yes  ║ 
║ DC & Facilities Services ║ ZZ795164  ║ No  ║ 
║ DC & Facilities Services ║ ZZ795247  ║ No  ║ 
╚══════════════════════════╩══════════════╩══════════╝ 

Team NameProject Code一起是複合主鍵。在這種情況下,我之後返回的結果是最後3行。當一個(項目和團隊)有多行(即上表中的前兩行)時,我只想選擇其中Actioned'Yes'的行。如果項目和團隊只有'No'被動(即上表中的最後2行),他們也需要包含在我的結果中。

有沒有辦法從SELECT聲明中得到結果?要定義WHERE條款似乎很難得到預期的結果。

+0

你能擁有一雙項目代碼條目既爲 「否」'Actioned'? –

+0

不,沒有重複。即:獨特的(項目和團隊)在操作中不能有兩個「否」的條目。 – jiaoziren

回答

2

使用SUM() OVER

;WITH CTE AS(
    SELECT *, 
     Y = SUM(CASE WHEN Actioned = 'YES' THEN 1 ELSE 0 END) OVER(PARTITION BY TeamName, ProjectCode), 
     N = SUM(CASE WHEN Actioned = 'NO' THEN 1 ELSE 0 END) OVER(PARTITION BY TeamName, ProjectCode) 
    FROM tbl 
) 
SELECT 
    TeamName, ProjectCode, Actioned 
FROM CTE 
WHERE 
    (Y = 1 AND Actioned = 'Yes') 
    OR (Y = 0) 

SQL Fiddle

+0

非常感謝 - 這正是我所追求的。 – jiaoziren

+0

你可能想看看Tim的答案。他的速度更快。 –

3

您可以嘗試分組對Team NameProject Code列的組合,然後使用MAX()功能,無論'Yes''No'出現給定組組合的情況下,選擇與'Yes'記錄。

SELECT `Team Name`, `Project Code`, MAX(`Actioned`) AS 'Actioned' 
FROM table 
GROUP BY `Team Name`, `Project Code`