【问题标题】:Grab value from multiple tables, use count and group by从多个表中获取值,使用 count 和 group by
【发布时间】:2012-05-30 13:18:24
【问题描述】:

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

global.status    // contains labels for global status ID's
     fields (id, text)
private.status   // contains labels for private status ID's
     fields (id, text)
private.cases    // contain case information, such as status
     fields (status, count(status) AS amount)

我需要将cases表中的状态与两个状态表中的状态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

你知道该怎么做吗?

【问题讨论】:

  • 能否在私有状态表和全局状态表中找到相同的 ID?
  • 是的,case 中的 status 字段包含一个等于 global.status 或 private.status 中的 id 的数字

标签: sql-server count group-by multiple-tables multiple-databases


【解决方案1】:
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

【讨论】:

  • 谢谢!这也可以 100% 工作,但是其他解决方案仅在 count 不为 0 时才给出输出,我不指定它是不好的..
【解决方案2】:

如果它们是不同的,您可以合并/合并所有本地和全局状态:

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

【讨论】:

  • 这很好用!!唯一的变化是一些大写字母并将“s.text”更改为“cast(s.text as varchar(100))”
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多