Sql 按状态获取每个位置的计数
我有两个名为Sql 按状态获取每个位置的计数,sql,sql-server,join,Sql,Sql Server,Join,我有两个名为QueueTable和Location的表 QueueTable数据如下所示 QueueID FkBranchID AddedTime Status 11001 10 2019-07-02 5 11002 10 2019-07-03 5 11003 10 2019-07-04 6 11004 10 2019-07-05 5 11005 20 2019-07-06
QueueTable
和Location
的表
QueueTable
数据如下所示
QueueID FkBranchID AddedTime Status
11001 10 2019-07-02 5
11002 10 2019-07-03 5
11003 10 2019-07-04 6
11004 10 2019-07-05 5
11005 20 2019-07-06 6
11006 20 2019-07-07 5
11007 20 2019-07-08 6
11008 20 2019-07-09 6
11009 20 2019-07-10 5
11010 30 2019-07-11 5
11011 30 2019-07-12 6
11012 30 2019-07-13 5
11013 30 2019-07-14 6
11014 30 2019-07-15 5
11015 40 2019-07-16 5
11016 40 2019-07-17 5
11017 40 2019-07-02 5
11018 40 2019-07-03 5
11019 40 2019-07-04 6
11020 50 2019-07-05 5
11021 50 2019-07-06 5
11022 50 2019-07-13 6
和位置
表格数据如下
BranchID BranchName
10 Delhi
20 Karnataka
30 Telangana
40 Gujarat
50 Tamil Nadu
现在我需要通过连接表来检索以下输出
我试过这个问题,我知道还有更多的错误,如何解决这个问题
select b.BranchId AS ID, b.BranchName,count(lo.QueueID) as Count1
from Location b
left outer join
(
select br.BranchId,l.QueueID
from QueueTable l
LEFT OUTER join Location br
on l.FkBranchId = br.BranchId
where l.IsActive = 1
GROUP BY l.QueueID) lo on lo.BranchId = b.BranchId
但它抛出了一个错误
列“Branch.BranchId”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
试试这个-
SELECT L.BranchID,
L.BranchName,
COUNT(CASE WHEN Status = 5 THEN 1 ELSE NULL END) [Count1(5)],
COUNT(CASE WHEN Status = 6 THEN 1 ELSE NULL END) [Count2(6)]
-- You can add more Column here based on Number of Status you have.
FROM Location L
LEFT JOIN QueueTable Q ON L.BranchID = Q.FKBranchID
WHERE Q.IsActive = 1
GROUP BY L.BranchID,L.BranchName
连接表,按BranchHid分组,BranchName使用CASE语句有条件地计算出现的5和6:
select
l.BranchId AS ID,
l.BranchName,
count(case q.Status when 6 then 1 end) as Count1,
count(case q.Status when 5 then 1 end) as Count2
from Location l left join QueueTable q
on l.BranchId = q.FkBranchId
where l.IsActive = 1
group by l.BranchId, l.BranchName
一个简单的方法是:
select
a.branchid,
a.branchname,
(select count(*) from queuetable where fkbranchid=a.branchid and status=5) status_5_count,
(select count(*) from queuetable where fkbranchid=a.branchid and status=6) status_6_count
from
location a
您可以在此服务器上实时执行此查询
使用动态查询来统计
状态
,特别是当它是动态的时候
DECLARE @col VARCHAR(1000)
DECLARE @sql VARCHAR(2000)
SELECT @col = COALESCE(@col + ', ','') + QUOTENAME(CAST([status] AS VARCHAR))
FROM #QueueTable
GROUP BY [status]
SET @sql = '
select BranchID, BranchName, ' + @col + '
from (
select l.BranchID, l.BranchName, FkBranchID, q.status
from #Location l
join #QueueTable q on q.FkBranchID=l.BranchID)p
PIVOT(COUNT(FkBranchID) FOR status IN ( ' + @col + ' )
) AS pvt
ORDER BY BranchID'
PRINT @sql
EXEC (@sql)
输出:
BranchID BranchName 5 6
10 Delhi 3 1
20 Karnataka 2 3
30 Telangana 3 2
40 Gujarat 4 1
50 Tamil Nadu 2 1
请不要以图片的形式发布数据,除非你希望志愿者转录数据,否则这些数据对你寻求帮助的人几乎毫无用处。请花点时间将数据以表格格式
文本
,或DDL和DML语句的形式发布。谢谢。@Larnu对不起,先生,我再也不会这样做了,你能帮我解决这个问题吗“我有三个表,分别是QueueTable
和Location
,”第三个是什么?您只提供了2个表和预期结果。当然,但我需要可以使用的格式的数据;我不能使用图像,所以我帮不了你。谢谢。请定义“但它不起作用”。你有错误吗?还是别的什么?除了5和6之外还有其他状态吗?如果有更多的状态而不仅仅是5和6呢?另外,您不认为这是一个左连接吗?OP的预期输出表明他/她只需要计算5和6个。@mkRabbani这是没有错误的,但是如果没有位置,它不在队列表中,它不会返回,如果位置没有映射到队列表,我需要显示它的计数列zeros@Adam脚本已更新。@mkRabbani我在QueueTable中有IsActive
列,那么我需要检查它的值,并且只有在IsActive=1
时才可以检索,我如何也检查QueueTable的IsActive状态?我在位置表中有另一个名为IsActive
的列,我只需要检索其中的IsActive=1
我该如何做也正好相反IsActive
在QueueTable中也有,然后我还需要检查它的值,我该如何检查QueueTable
IsActive状态呢?其中l.IsActive=1和q.IsActive=1
当我按原样添加它时,没有行减少,它不会发生。只有计数可以减少,但行不能减少,我想我需要在这里检查它(情况q.状态当6时,则1结束)
我可以在那里检查isActive吗?情况q.状态当6和q.IActive=1时,则1结束
我可以用作此项吗?原因是什么,你能解释我的原因吗?它特别有用,当新的状态出现在你的表中时,你不需要改变查询来显示它的计数,上面的动态代码也会考虑这个新的状态。