2016-05-17 7 views
0

У меня есть таблица, которая выглядит следующим образом:Conditionals и агрегаты по нескольким таблицам

`units` 
+----+------+-------+---------------+-------+ 
| id | tech | jobID |  city  | units | 
+----+------+-------+---------------+-------+ 
| 1 | 1234 | 8535 | San Jose  |  3 | 
| 2 | 1234 | 8253 | San Francisco |  4 | 
| 3 | 1234 | 2457 | San Francisco |  5 | 
| 4 | 1234 | 8351 | Mountain View |  8 | 
+----+------+-------+---------------+-------+ 

и вид, который использует эти данные, чтобы сделать некоторые расчеты:

`total` 
+----+--------+------+-------+ 
| id | name | tech | total | 
+----+--------+------+-------+ 
| 1 | Dan | 1234 | 12 | 
| 2 | Dan SF | 1234 | 12 | 
+----+--------+------+-------+ ... 

Моя проблема заключается в том, что я пытаясь подытожить количество единиц, завершенных в Сан-Франциско, и количество единиц, которые он сделал в другом месте (необходимо конкретно отслеживать, сколько единиц было завершено в СФ). Тем не менее, я не уверен, как это сделать в рамках выбранного запроса, и если вы посмотрите на мою текущую общую таблицу, вы увидите, что оба общих значения просто суммируют все единицы независимо от города.

Я хочу, чтобы получить следующее:

`total` 
+----+--------+------+-------+ 
| id | name | tech | total | 
+----+--------+------+-------+ 
| 1 | Dan | 1234 | 11 | 
| 2 | Dan SF | 1234 |  9 | 
+----+--------+------+-------+ ... 

мне нужна помощь в написании моей ВЫБРАТЬ, потому что я не уверен в том, как использовать СЛУЧАЙ, чтобы получить желаемый результат. Я пробовал следующее:

SELECT otherTable.name AS name, units.tech AS tech, 
(CASE WHEN City = 'SAN FRANCISCO' THEN SUM(units) 
     ELSE SUM(units) 
) AS total 
FROM units, otherTable 
GROUP BY name 

но ясно, что это не сработает, так как я не различаю между городами в двух агрегатах.

Любая помощь очень ценится.

EDIT: SELECT, запрос для моего текущего вида (с присоединиться к информации) выглядит следующим образом:

SELECT otherTable.name, units.tech, SUM(units.units) 
FROM units 
LEFT JOIN otherTable ON otherTable.tech = units.tech 
GROUP BY name 

Что касается otherTable, он просто связывает каждый тек ID с именем:

`otherTable` 
+----+--------+------+-----------+ 
| id | name | tech | otherInfo | 
+----+--------+------+-----------+ 
| 1 | Dan | 1234 | ...... | 
+----+--------+------+-----------+ 
+0

В запросе вы кросс соединения двух таблиц, поэтому каждое имя сочетается с каждым блоком. Но, по вашему мнению, вы показываете пользователю «Дэн SF» для «Сан-Франциско» и «Дэн» для других. Как так? Пожалуйста, покажите, как связаны две таблицы. Откуда вы знаете, что Дэн закончил подразделения? –

+0

Извините, я обновил сообщение с информацией о соединении. – mathmorales

+0

Хорошо, так что название «Dan SF» составлено. Используйте запрос pgreen2 'UNION ALL', а затем настроенные соединения. –

ответ

1

Во-первых, похоже, что ваш базовый запрос неверен. Нет ничего о соединении между units и otherTable, но я не знаю достаточно, чтобы его вставить.

Мне кажется странным, что вы хотели бы, чтобы он разбился на строки вместо столбцов, но вы могли бы сделайте следующее:

SELECT otherTable.name AS name, units.tech AS tech, 
SUM(units) AS total 
FROM units, otherTable 
-- not sure if this section should exclude 'SAN FRANCISO' or not 
GROUP BY name 
UNION ALL 
SELECT otherTable.name || ' SF' AS name, units.tech AS tech, 
SUM(units) AS total 
FROM units, otherTable 
WHERE City = 'SAN FRANCISCO' 
GROUP BY name 

Это даст вам

+--------+------+-------+ 
| name | tech | total | 
+--------+------+-------+ 
| Dan | 1234 | 11 | 
| Dan SF | 1234 |  9 | 
+--------+------+-------+ 

Или, если вы хотите, отдельные колонки, вы могли бы сделать это

SELECT otherTable.name AS name, units.tech AS tech, 
SUM(units) AS total, 
SUM(CASE WHEN City = 'SAN FRANCISCO' THEN units 
     ELSE 0 
) AS sf_total 
FROM units, otherTable 
GROUP BY name 

Это даст вам

+--------+------+-------+----------+ 
| name | tech | total | sf_total | 
+--------+------+-------+----------+ 
| Dan | 1234 | 11 |  9 | 
+--------+------+-------+----------+ 
+0

В моей спешке я забыл включить информацию о соединении. Тем не менее, это именно то, что мне нужно, так как я не знал, как использовать CASE в этом случае, и этого было достаточно. Большое спасибо! – mathmorales

Смежные вопросы