SQL:今天与GROUP BY发生问题

时间:2015-05-06 21:04:08

标签: sql sql-server group-by having

谈到这一点,我生气了。实际上,我在脑海中想象它的方式听起来很容易,但是当我开始写出来时,我会得到不同的结果。

这是问: 运行报告,显示所有帐户密钥及其没有WIP版本的小册子类型。

背景: 我们系统中的每个帐户密钥都有9种不同的小册子类型。这些类型中的每一种都具有状态。状态可以是(3)等待批准,(4)批准,(5)正在进行中,或(8)被拒绝。

包含结果的示例数据: enter image description here

从此屏幕截图中您可以看到除“自我注册”之外的所有小册子类型都没有(5)正在进行的工作。那些需要出现在我想要的报告上。

另一个例子来解释我想要获得的东西: enter image description here

使用不同的帐户密钥进行相同的查询。您可以看到AIP的状态(5)正在进行中列出3x,因此这不会显示在我正在尝试收集的报告上。

以下是我尝试的代码,但似乎不起作用:

select b.trackingid, b.bookletname from booklet b
inner join [status] s on s.id = b.statusid
inner join [user] u on b.createdby = u.id
inner join client c on u.clientid = c.id
where c.clientname = 'MM' and
(select count(*) from booklet where trackingid = b.trackingid and statusid = 5) = 0

我也尝试过使用GROUP BY和HAVING:

select trackingid, b.bookletname, b.StatusID from booklet b
inner join [user] u on u.id = b.userid
inner join [client] c on c.id = u.clientid
where c.id = 2
--and b.statusID != 5
group by trackingid, bookletname, b.StatusID
--having count(statusid) < 1
order by trackingid

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:1)

当我试图报告我正在查看的每个键有很多行的数据集时,我喜欢使用with生成一个键列表;这样你的主要查询就不必查看其他内容了。  所以有几个例子可能是这样的:

My

; with wips as (
        Select Distinct trackingid
    From    booklet
    Where   statusid = 5
    ),
    nowips as(
    Select Distinct trackingid nwtid
    From    booklet
    Where   TrackingID not in (select * from wips)
    )
Select  <what ever you need>
From    Booklet
Join    nowips on TrackingID=nwtid
Where   <additional logic>

这应该有助于消除报告中的wip数据。

答案 1 :(得分:0)

请试试这个:

--returns all bookletname not in status_id = 5
SELECT 
     trackingid
    ,b.bookletname
    ,b.StatusID
    ,count(*)
FROM booklet b
INNER JOIN [user] u ON u.id = b.userid
INNER JOIN [client] c ON c.id = u.clientid
WHERE c.id = 2
    AND b.statusid <> 5
GROUP BY trackingid, b.bookletname,b.statusid

UNION

--returns bookletnames = 'Self Registration and b.statusid = 5
SELECT 
     trackingid
    ,b.bookletname
    ,b.StatusID
    ,count(*)
FROM booklet b
INNER JOIN [user] u ON u.id = b.userid
INNER JOIN [client] c ON c.id = u.clientid
WHERE c.id = 2
    AND b.statusid = 5
    AND b.bookletname = 'Self Registration'
GROUP BY trackingid, b.bookletname,b.statusid
ORDER BY trackingid

这应该返回两个bookletname的组合,其中statusid&lt;&gt; 5包括自我注册和statusid = 5.希望这有帮助!

答案 2 :(得分:0)

如果有trackingid的任何行,您想要排除statusID=5吗? 使用CASE进行条件计数:

select trackingid, b.bookletname 
from booklet b
inner join [user] u on u.id = b.userid
inner join [client] c on c.id = u.clientid
where c.id = 2
group by trackingid, bookletname
having sum(case when b.statusID = 5 then 1 else 0 end) = 0