2014-10-29 108 views
2

我试图返回完全拒绝的不同发票的数量。发票可以包含多个订单项。如果发票的某个订单项的原因为'',另一个'已拒绝',那么它不会被完全拒绝,因此不应计入。SQL Server计数查询比较结果总数

我想要的结果是合乎逻辑地

Client  | No. of Invoices Fully Rejected 
------------------------------------------- 
Schogotten | 1 
Maiken  | 2 

,我相信我回到那里的线项目总数等于其中的原因是每张发票的发票被拒绝的次数发票的数量。

这里是SQL Fiddle

MS SQL Server 2008的架构设置

CREATE TABLE Tmp (
    id int NOT NULL, 
    client varchar (24) NOT NULL, 
    invoice varchar(5) NOT NULL, 
    statusid int NOT NULL, 
    reason varchar (24) 
) 


INSERT INTO Tmp (id, client, invoice, statusid, reason) 
VALUES (12345, 'Schogotten', 'ABC12', -99, 'Rejected') 
, (12346, 'Schogotten', 'ABC12', -99, 'None') 
, (12347, 'Schogotten', 'ABC12', 10001, 'ReadyToPay') 
, (12348, 'Schogotten', 'ABC11', -99, 'Rejected') 
, (12349, 'Schogotten', 'ABC10', -99, 'None') 
, (12350, 'Maiken', 'ABC13', -99, 'Rejected') 
, (12351, 'Maiken', 'ABC14', 9006, 'ReadyToPay') 
, (12351, 'Maiken', 'ABC14', -99, 'None') 
, (12352, 'Maiken', 'ABC15', -99, 'Rejected'); 

查询1

SELECT Client 
, COUNT(Invoice) 
FROM Tmp 
WHERE Reason = 'Rejected' 
GROUP BY Client 

Results

|  CLIENT | COLUMN_1 | 
|------------|----------| 
|  Maiken |  2 | 
| Schogotten |  2 | 
+0

您是否知道SQL小提琴在“Run SQL”按钮上有一个“Markdown Ouptut”选项,您可以简单地将其粘贴到上述问题中? – Tanner 2014-10-29 11:06:10

+0

@坦纳我现在。感谢您的关注。 – user1773949 2014-10-29 11:34:28

回答

1

我会用一个子查询找到相关的发票,然后通过客户端使用一个外部查询到组:

select client,COUNT(*) from (
    select client,invoice 
    from Tmp 
    group by client,invoice 
    having MIN(reason) = MAX(reason) and 
    MIN(reason) = 'Rejected' 
) t 
group by client 

凡希望的逻辑是简单的阅读 - 子查询只找到发票哪里所有行都具有相同的值(MIN(reason) = MAX(reason)),其原因是Rejected,然后我们只计数它们。

+0

谢谢,这是非常有意义的,并且是我的问题的解决方案。 – user1773949 2014-10-29 12:10:59