2014-01-10 4 views
0

Я пытаюсь получить отдельные подсчеты для столбца ресурсов двух разных таблиц, а затем показать сравнение для каждого идентификатора проекта. Прямо сейчас этот запрос дает мне одинаковые значения для обеих таблиц.SQL: подсчет двух разных столбцов из двух разных таблиц

select 
    t1.PRJCT_ID, 
    count(t1.RSRC_ID) as TBL1_RSRC_CNT, 
    t2.PRJCT_ID, 
    count(t2.RSRC_ID) as TBL2_RSRC_CNT 
from 
    DATA_TABLE_1 t1 
LEFT OUTER JOIN 
    DATA_TABLE_2 t2 on t1.PRJCT_ID = t2.PRJCT_ID 
GROUP BY 
    t1.PRJCT_ID, t2.PRJCT_ID 
order by 1 
+0

Вы группируете как 't1.PRJCT_ID', так и' t2.PRJCT_ID', потому что хотите видеть проекты из первой таблицы, отсутствующие во второй таблице? В противном случае, условие соединения 't1.PRJCT_ID = t2.PRJCT_ID' гарантирует, что они всегда одинаковы. – dasblinkenlight

+0

Вы пытались добавить DISTINCT внутри COUNT? –

ответ

1

Конечно вы собираетесь получить тот же счет, как это, вы подсчетом столбцы той же таблицы (которая производится объединение, как должное, но это все-таки прямоугольный Таблица).

Что вы хотите сделать, это использовать подзапросы. Сначала получите список всех ID проекта (из таблицы, или объединения разбора обоего таблиц в вопросе, но это признак плохой нормализации базы данных), то запрос таблицы независимо для их подсчета:

select p.ID, 
    (select count(*) from DATA_TABLE_1 t1 where t1.ID=p.ID) Count1, 
    (select count(*) from DATA_TABLE_2 t2 where t2.ID=p.ID) Count2 
from projects p 
+0

use 'count (1)' - выполняет лучше, чем 'count (*)' –

+2

Нет, нет, пожалуйста, не выставляйте то, что вы видите в Интернете здесь, и запустите 'объяснение' по запросу, чтобы убедиться сами , – Blindy

+0

Спасибо за обучение. У меня было неправильное впечатление. –

1

Примечание: Я полагаю, что вы где-то находитесь в таблице PROJECT. Я думаю, что лучший способ сделать это - это два подзапроса. Таким образом, у вас будут все ваши проекты, даже те, у кого нет ресурсов. Что-то вроде:

SELECT 
    p.PRJCT_ID, 
    (SELECT COUNT(*) FROM DATA_TABLE_1 t1 WHERE t1.PRJCT_ID = p.PRJCT_ID) AS TBL1_RSRC_CNT, 
    (SELECT COUNT(*) FROM DATA_TABLE_2 t2 WHERE t2.PRJCT_ID = p.PRJCT_ID) AS TBL2_RSRC_CNT 
FROM PROJECT p 
ORDER BY p.PRJCT_ID 
-1

Вы также может использовать предложение CASE в сочетании с общей функцией SUM.

select 
    t1.PRJCT_ID, 
    SUM(CASE WHEN t1.RSRC_ID IS NULL THEN 0 ELSE 1 END) as TBL1_RSRC_CNT, 
    t2.PRJCT_ID, 
    SUM(CASE WHEN t2.RSRC_ID IS NULL THEN 0 ELSE 1 END) as TBL2_RSRC_CNT 
from 
    DATA_TABLE_1 t1 
LEFT OUTER JOIN 
    DATA_TABLE_2 t2 on t1.PRJCT_ID = t2.PRJCT_ID 
GROUP BY 
    t1.PRJCT_ID, t2.PRJCT_ID 
order by 1 
Смежные вопросы