2015-11-04 152 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`