2

Я пытаюсь вывести некоторые данные в MSSQL из трех разных таблиц (статус, состояние & случаев) в 2 разных базах данных (глобальный & частный).Захват значения из нескольких таблиц, использование count и group по

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) 

Мне нужно сравнить статус в таблице случаев со статусом 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 

Есть ли у вас какие-либо идеи, что делать ??

+0

Может же ID можно найти в частных и глобальных таблиц состояния? –

+0

Да, поле статуса в случаях содержит число, равное id либо в global.status, либо в private.status –

ответ

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 
+0

Это работает отлично! только изменения - это некоторые Uppercases и изменение «s.text» на «cast (s.text as varchar (100))» –

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 
+0

Спасибо! это работает и на 100%, но другое решение дает результат только тогда, когда счетчик не равен 0, мой плохой для того, чтобы не указывать его. –

+0

@ RudiHansen: см. сообщение об обновлении – Quassnoi