SQL Outer Join для нескольких суммированных столбцов в одной таблице - PullRequest
1 голос
/ 12 января 2012

Я работаю с библиотекой SQL (библиотека программирования, совместимая с ANSI SQL, называемая базой данных ABS, (http://www.componentace.com/help/absdb_manual/absdbmanual_content.htm). поддерживает различные объединения, CASE и т. Д. *

У меня есть одна таблица (appt), которая является таблицей встреч.

ApptKey - Integer - Primary Key
SA_ID -  Integer  (a person’s ID, think employee number),
Layer - Integer – only 4 different values, 1, 2, 3 or 4 (think Appt Category)
Number_Of_Minutes  - Integer – the length of the appointment

Обратите внимание, что некоторые комбинации SA_ID / Layer могут быть пустыми (то есть для этой комбинации нет строк). Другие комбинации SA_ID / Layer могут иметь несколько строк (я не показываю другие столбцы, поскольку они здесь не актуальны). Мне нужен отчет, чтобы показать сумму минут, для каждого человека (SA_ID), для каждого слоя, в одной строке ... т.е. каждый SA_ID имеет свою собственную строку, показывая сумму для Layer = 1, сумму для layer = 2, сумма для слоя = 3, а сумма для слоя = 4.

Пример данных…

SA_ID         LAYER        Number_of_Minutes
1             1            10
1             1            30
2             1            10
3             2            10
1             4            10

Мне нужен запрос, который дает этот результат.

SA_ID      LAYER_1     LAYER_2    LAYER_3     LAYER_4
1          40          0          0           10
2          10          0          0           0
3          0           10         0           0

Мне нужен этот тип формата, потому что этот запрос передает компонент Chart / graph ...

Я думаю, что мне нужно использовать правильное объединение нескольких коррелированных подзапросов, но я просто не могу заставить его работать. Это правильный подход. То, что у меня ниже, работает, но как прямое соединение. Могу ли я (или как я) переписать это, чтобы использовать правильное внешнее соединение? Правильное внешнее соединение - лучший подход?

select g.sa_id,  l1.totalsum, l2.totalsum, l3.totalsum, l4.totalsum
from  (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 1 group by sa_id, layer) l1,
           (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 2 group by sa_id, layer) l2,
           (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 3 group by sa_id, layer) l3,
          (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 4 group by sa_id, layer) l4,
          (select distinct sa_id "sa_id" from appt) g
where
      (l1.sa_id = g.sa_id)
and   (l2.sa_id = g.sa_id)
and   (l3.sa_id = g.sa_id)
and   (l4.sa_id = g.sa_id)

Ответы [ 2 ]

1 голос
/ 12 января 2012
SELECT SA_ID,
SUM(CASE WHEN LAYER = 1 THEN Number_of_Minutes ELSE 0 END) AS LAYER_1, 
SUM(CASE WHEN LAYER = 2 THEN Number_of_Minutes ELSE 0 END) AS LAYER_2,
SUM(CASE WHEN LAYER = 3 THEN Number_of_Minutes ELSE 0 END) AS LAYER_3,
SUM(CASE WHEN LAYER = 4 THEN Number_of_Minutes ELSE 0 END) AS LAYER_4
FROM Appt
GROUP BY SA_ID

РЕДАКТИРОВАТЬ: потому что он поддерживает CASE выражений.

0 голосов
/ 12 января 2012
SELECT
    t.sa_id,
    Layer1=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 1),
    Layer2=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 2),
    Layer3=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 3),
    Layer4=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 4)

FROM
(
    SELECT DISTINCT
        sa_id
    FROM appt
) t
...