Sql server 从多个表中获取值,使用计数和分组方式
我试图在MSSQL中从2个不同数据库(全局和私有)中的3个不同表(状态、状态和案例)输出一些数据 我需要将案例表中的状态与两个状态表中的状态ID进行比较,并输出以下内容:Sql server 从多个表中获取值,使用计数和分组方式,sql-server,count,group-by,multiple-tables,multiple-databases,Sql Server,Count,Group By,Multiple Tables,Multiple Databases,我试图在MSSQL中从2个不同数据库(全局和私有)中的3个不同表(状态、状态和案例)输出一些数据 我需要将案例表中的状态与两个状态表中的状态ID进行比较,并输出以下内容: statusID | text | amount ----------|-------------|-------- 9993 | Open | 24 9991 | Closed | 3 9992 | Pendin
statusID | text | amount
----------|-------------|--------
9993 | Open | 24
9991 | Closed | 3
9992 | Pending | 12
拥有全局和私有的原因是私有允许自定义私有状态,其中全局可在整个系统中访问
我尝试使用以下sql语句失败
SELECT c.status,
COUNT(c.status) as amount,
ss.text,
gs.text
FROM [DB11111111].dbo].[cases] AS c, [DB11111111].[dbo].[status] AS ss, [global].[dbo].[status] AS gs
WHERE (c.status = ss.id) OR (c.status = gs.id)
GROUP BY c.status, ss.text, gs.text
ORDER BY amount DESC
你知道该怎么做吗???如果本地和全局状态不同,你可以合并/合并它们:
SELECT c.status,
COUNT(c.status) as amount,
s.text
FROM [DB11111111].dbo.[cases] AS c
LEFT JOIN
(
select id, [text]
from [DB11111111].[dbo].[status]
union all
select id, [text]
from [global].[dbo].[status]
) s
ON c.Status = s.Id
GROUP BY c.status, s.Text
ORDER BY amount DESC
如果它们重叠,您需要定义哪个优先,并对它们使用完全外部联接
SELECT c.status,
COUNT(c.status) as amount,
s.text
FROM [DB11111111].dbo.[cases] AS c
LEFT JOIN
(
-- local before global
select isnull (l.id, g.id) ID
isnull (l.[text], g.[text]) [text]
from [DB11111111].[dbo].[status] l
full outer join [global].[dbo].[status] g
on l.id = g.id
) s
ON c.Status = s.ID
GROUP BY c.status, s.Text
ORDER BY amount DESC
可以在private和global status表中找到相同的ID吗?是的,cases中的status字段包含一个与global.status或private.status中的ID相等的数字。这非常有效!!唯一的改动是一些大写字母,并将“s.text”改为“cast(s.text为varchar(100))”谢谢!这也可以100%工作,但另一种解决方案只在count不是0时提供输出,我的缺点是没有指定它。。
SELECT c.status,
COUNT(c.status) as amount,
s.text
FROM [DB11111111].dbo.[cases] AS c
LEFT JOIN
(
-- local before global
select isnull (l.id, g.id) ID
isnull (l.[text], g.[text]) [text]
from [DB11111111].[dbo].[status] l
full outer join [global].[dbo].[status] g
on l.id = g.id
) s
ON c.Status = s.ID
GROUP BY c.status, s.Text
ORDER BY amount DESC
SELECT *
FROM (
SELECT id, text
FROM private
UNION ALL
SELECT id, text
FROM global
) q
CROSS APPLY
(
SELECT COUNT(*) cnt
FROM cases
WHERE status = q.id
GROUP BY
status
) c