谈到这一点,我生气了。实际上,我在脑海中想象它的方式听起来很容易,但是当我开始写出来时,我会得到不同的结果。
这是问: 运行报告,显示所有帐户密钥及其没有WIP版本的小册子类型。
背景: 我们系统中的每个帐户密钥都有9种不同的小册子类型。这些类型中的每一种都具有状态。状态可以是(3)等待批准,(4)批准,(5)正在进行中,或(8)被拒绝。
包含结果的示例数据:
从此屏幕截图中您可以看到除“自我注册”之外的所有小册子类型都没有(5)正在进行的工作。那些需要出现在我想要的报告上。
另一个例子来解释我想要获得的东西:
使用不同的帐户密钥进行相同的查询。您可以看到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
非常感谢任何帮助。谢谢!
答案 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