Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 2012窗口函数完成我的查询?_Sql_Group By_Sql Server 2012_Window Functions - Fatal编程技术网

如何使用SQL Server 2012窗口函数完成我的查询?

如何使用SQL Server 2012窗口函数完成我的查询?,sql,group-by,sql-server-2012,window-functions,Sql,Group By,Sql Server 2012,Window Functions,假设我有一张修理票的表格,看起来是这样的: Group Ticket Status ---------------------------- 00798 299696 Open 21851 574587 Complete 21851 574588 Pending 21852 574589 Office 21866 574613 Test 21869 574617 Shipping 21870 574618 Repair 21871 574620

假设我有一张修理票的表格,看起来是这样的:

Group   Ticket  Status
----------------------------
00798   299696  Open
21851   574587  Complete
21851   574588  Pending
21852   574589  Office
21866   574613  Test
21869   574617  Shipping
21870   574618  Repair
21871   574620  Open
32102   369151  Repair
43316   393920  Office
60669   433162  Office
65850   445815  Open
65999   446267  Complete
66215   446841  Repair
77818   473653  Complete
79691   477963  Office
82277   483787  Pending
86283   493697  Complete
86283   493698  Complete
我正在尝试获取状态为“已完成”的所有票证的列表,前提是组中的所有票证都已完成。因此,从这个数据集,我可以得到这些票据:

446267     
473653     
493697    
493698   
我不会得到574587,因为在它的组(21851)中有另一个票证(574588)设置为待定,未完成

我尝试过将
ROW_NUMBER()作为子查询(按GroupNumber划分,[Status]按GroupNumber排序)
的变体,但我无法理解这一点。也许只需要GROUPBY和一个子查询就可以了?谢谢。

SQL Fiddle:

这两种方法中的任何一种都应该有效:

--get every record
select * 
from RepairTickets a
--where the status is complete
where [status] = 'Complete'
--and the status matches every...
and [status] = all 
(
    --other record's status
    select [status]
    from RepairTickets b
    --in the same group 
    where b.[Group] = a.[Group]
)


注意:在上述两种情况下,由于我们知道我们只寻找完整的记录,我们可以通过替换与内部查询相关的对[Status]的一些引用来进行优化;但是,上面的内容应该更容易修改,因为您只需要在一个地方声明您感兴趣的状态。

您考虑得太多了。窗口功能并不适用于所有情况。您可以简单地计算每个组中的票证数量与已完成票证的数量:

WITH tmp AS
(
    SELECT  GroupID,
            COUNT(TicketID) AS TotalTicket,
            SUM(CASE WHEN Status = 'Complete' THEN 1 ELSE 0 END) AS CompletedTicket
    FROM    Repair
    GROUP BY GroupID
)

SELECT      Repair.TicketID
FROM        tmp
INNER JOIN  Repair  ON tmp.GroupID = Repair.GroupID
WHERE       tmp.CompletedTicket = tmp.TotalTicket

(SQL Fiddle目前已关闭,因此我无法发布)

我认为您可以在不存在的地方使用(…)谢谢,我不知道“所有”,这两种方法都很好。
WITH tmp AS
(
    SELECT  GroupID,
            COUNT(TicketID) AS TotalTicket,
            SUM(CASE WHEN Status = 'Complete' THEN 1 ELSE 0 END) AS CompletedTicket
    FROM    Repair
    GROUP BY GroupID
)

SELECT      Repair.TicketID
FROM        tmp
INNER JOIN  Repair  ON tmp.GroupID = Repair.GroupID
WHERE       tmp.CompletedTicket = tmp.TotalTicket