2

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)

ケース テーブルのステータスと 2 つのステータス テーブルのステータス 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

何をすべきか考えていますか??

4

2 に答える 2

3
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
于 2012-05-30T13:30:47.073 に答える
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
于 2012-05-30T13:29:48.090 に答える