MS SQL查询按状态列出计数

MS SQL查询按状态列出计数,sql,sql-server,aggregate,Sql,Sql Server,Aggregate,我想达到下面的结果。我想列出所有状态为“待批准”的记录以及以下条件: 例如用户名“Leo” if ProcedureLevel="Propose" then count all userId of 'Leo' from ProposedCheckBy field if ProcedureLevel="Endorse" then count all userId of 'Leo' from EndorsedCheckBy field if Procedu

我想达到下面的结果。我想列出所有状态为“待批准”的记录以及以下条件:

例如用户名“Leo”

if ProcedureLevel="Propose" then count all userId of 'Leo' from ProposedCheckBy field 
if ProcedureLevel="Endorse" then count all userId of 'Leo' from EndorsedCheckBy field 
if ProcedureLevel="Approve" then count all userId 'Leo' from ApprovedCheckBy field 
然后将所有状态加总为“待批准”,即检查者为“Leo”,符合上述条件

I want to achieved the result like this
-----------------------------------------
Username   | No of For Approval  |
Leo        |   3                 |
Taurus     |   2                 | 
Capricorn  |   1                 | 
-----------------------------------------
Tables

Users
Id, userName

Limits

Id, [Description] ,[status],[procedurelevel] checkbyby1,checkbyby2, checkby3

Users

Id   [UserName]
1    Leo
2    Taurus
3    Capricorn

Limits

Id, [Description] ,[status]       ,[procedurelevel] ProposedCheckedBy1 ,EndorsedCheckedBy2 , ApprovedCheckBy3

1     Limits1       For Approval    Propose         1                      null                null
2     Limits2       For Approval    Propose         1                      null                null
3     Limits3       For Approval    Endorse         1                      2                   null  
4     Limits4       For Approval    Approve         1                      2                   1  
5     Limits5       For Approval    Approve         2                      3                   2
5     Limits5       For Approval    Approve         1                      2                   3

我想这就是你想要的;如果不是这样,我已经创建了表和数据插入,这将有助于提供最终解决方案的人。我认为联合是你正在寻找的东西;使用status 1,2,3列,您可以在一次过程中反向查找当前用户

它现在返回

NoMatches   procedurelevel  userName
1           Approve     Leo
1           Endorse     Taurus
1           Propose         Capricorn
2           Propose     Leo
1           Propose         Taurus



Create table tblUsers
(
Id int, userName varchar(100)
)

Create table tblLimits

(
Id int, [Description] varchar(20),[status] varchar(20),[procedurelevel] varchar(20), checkby1 int,checkby2 int, checkby3 int
)

insert into tblUsers select 1, 'Leo'
insert into tblUsers select 2, 'Taurus'
insert into tblUsers select 3, 'Capricorn'



insert into tblLimits select 1, 'Limits1', 'For Approval', 'Propose',1, null,null
insert into tblLimits select 2, 'Limits2', 'For Approval', 'Propose',1, null, null
insert into tblLimits select 3, 'Limits3', 'For Approval', 'Endorse',1, 2,null  
insert into tblLimits select 4, 'Limits4', 'For Approval', 'Approve',1, 2,1  
insert into tblLimits select 5, 'Limits5', 'For Approval', 'Propose',2, 3,2
insert into tblLimits select 5, 'Limits5', 'For Approval', 'Propose',1, 2,3


select count(ProcedureLevel) as NoMatches, procedurelevel, bb.userName
From tbllimits aa
inner join tblUsers bb
on coalesce(checkby3, checkby2, checkby1) = bb.id
group by bb.userName, aa.procedurelevel

drop table tblusers
drop table tbllimits

这是我的答案,问题是Leo有2个批准,而不是3个。如果我错了,请纠正

WITH UserAsignedLimits AS (SELECT ProposedCheckedBy AS Id
    , COUNT(ProposedCheckedBy) AS NoCheckBy 
FROM Limits
WHERE [Status]='ForApproval'
AND Procedurelevel='Propose'
GROUP BY ProposedCheckedBy
UNION ALL
SELECT EndorsedCheckedBy AS Id
    , COUNT(EndorsedCheckedBy) AS NoCheckBy 
FROM Limits
WHERE [Status]='ForApproval'
AND Procedurelevel='Endorse'
GROUP BY EndorsedCheckedBy
UNION ALL
SELECT ApprovedCheckedBy AS Id
    , COUNT(ApprovedCheckedBy) AS NoCheckBy 
FROM Limits
WHERE [Status]='ForApproval'
AND Procedurelevel='Approve'
GROUP BY ApprovedCheckedBy)

SELECT ID, COUNT(NoCheckBy) as NoofForApproval 
FROM UserAsignedLimits
GROUP BY Id

基于过程级别,您需要什么样的逻辑输出?@gbn-这是我想要实现的输出结果用户名No供批准狮子座3金牛座2摩羯座1,但不确定如何获得这些结果。为什么金牛座有2分的结果?看看3分和5分的记录,金牛座是检查结果的人,程序级别为认可和批准U07CH-非常感谢。。。如何用高分投票,为什么投票分数只有1分?