Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从多个表中获取值,使用计数和分组方式_Sql Server_Count_Group By_Multiple Tables_Multiple Databases - Fatal编程技术网

Sql server 从多个表中获取值,使用计数和分组方式

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

我试图在MSSQL中从2个不同数据库(全局和私有)中的3个不同表(状态、状态和案例)输出一些数据

我需要将案例表中的状态与两个状态表中的状态ID进行比较,并输出以下内容:

    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