2015-01-02 3 views
1

У меня есть две таблицы, например:Две таблицы подсчитывать в двух seprate столбцов

table1 
--------------------- 
|id | name| isActive| 
|---|-----|---------| 
| 1 | dd | 1 | 
| 1 | cc | 1 | 
| 1 | zz | 1 | 
| 1 | yy | 1 | 
--------------------- 


table2 
--------------------- 
|id | name| isActive| 
|---|----|----------| 
| 1 | ab | 1 | 
| 1 | cd | 1 | 
| 1 | ef | 1 | 
| 1 | gh | 1 | 
--------------------- 

требования должны получить счетчик обеих таблиц и вывести их на две отдельные колонки и распечатывать его на две отдельные колонки в BIRT Отчет я попытался это

SELECT 
    COUNT(table2.`name`) Table1Count, 
    table1.`isActive` Table1IsActive , 
    COUNT(table2.`name`) Table2Count, 
    table2.`isActive` Table2IsActive 
FROM 
    `table1`, 
    `table2` 

ИТС из положить в двух отдельных колонках, но с крестом присоединиться

Table1Count isActive Table2Count Table2IsActive 
----------- -------- ----------- ---------------- 
    43316   0   3536     1 

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

, пытаясь это я получить два отдельных строки

SELECT 
    * 
FROM 
    (SELECT 
    COUNT(*) Table1Count, 
    table1.`isActive` Table1IsActive 
    FROM 
    `table1` 
    UNION 
    SELECT 
    COUNT(*) Table2Count, 
    table2.`isActive` Table2IsActive 
    FROM 
    `table2 `) AS a 

его выход находится в двух отдельных строках, а мои требования отдельные столбцы

Table1Count Table1IsActive 
------------ -------------- 
    442   0 
    98   1 

ответ

1

В вашем UNION добавьте дополнительные столбцы для столбцов из другой таблицы. Затем объединить их с помощью MAX()

SELECT MAX(Table1Count) AS Table1Count, MAX(Table1IsActive) AS Table1IsActive, 
     MAX(Table2Count) AS Table2Count, MAX(Table2IsActive) AS Table2IsActive 
FROM (SELECT COUNT(*) Table1Count, table1.`isActive` Table1IsActive, 0 Table2Count, 0 Table2IsActive 
     FROM `table1` 
     UNION 
     SELECT 0 Table1Count, 0 Table1IsActive, COUNT(*) Table2Count, table2.`isActive` Table2IsActive 
     FROM `table2`) AS a 
+0

Неизвестная колонка «Таблица2Count» в полевом списке :( –

+0

Забыл ли вы '0 'перед' Table2Count' в строке 3? – Barmar

+0

У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, используемого рядом с '0 Table1Count, –

1

Попробуйте это:

SELECT (SELECT COUNT(*) FROM `table1`) AS Table1Count, 
     (SELECT COUNT(*) FROM `table2`) AS Table2Count; 
+0

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

1

UNION всегда будет использовать имена столбцов из первого выбора в союзе. Поскольку оба запроса возвращают одну строку, что вы можете использовать простой декартово произведение (1 х 1 = 1), чтобы объединить запросы:

SELECT t1.Table1Count, t1.Table1IsActive, t2.Table2Count, t2.Table2IsActive 
FROM 
    (SELECT 
    COUNT(*) Table1Count, 
    table1.isActive Table1IsActive 
    FROM 
    table1 
    GROUP BY table1.isActive 
    ) as t1, 
    (SELECT 
    COUNT(*) Table2Count, 
    table2.isActive Table2IsActive 
    FROM 
    table2 
    GROUP BY table2.isActive  
) as t2; 

Редактировать

Обновление от комментариев - Я считаю, что вы после как следует, а именно для подсчета всех строк и рассчитывать только активные строки (в одном запросе), а затем повторить это через две таблицы, чтобы проецировать один результат строки:

SELECT 
     t1.Table1Count, t1.Table1Active, t2.Table1Count, t2.Table2Active 
FROM 
    (
     SELECT COUNT(t1.id) AS Table1Count, 
       SUM(CASE WHEN t1.IsActive = '1' THEN 1 ELSE 0 END) AS Table1Active 
     FROM Table1 t1 
    ) t1, 
    (
     SELECT COUNT(t2.id) AS Table1Count, 
       SUM(CASE WHEN t2.IsActive = '1' THEN 1 ELSE 0 END) AS Table2Active 
     FROM Table2 t2 
    ) t2; 

это важно что обе производные таблицы (t1 и t2) сглаживаются в одну строку, в противном случае декартово произведение будет дублировать строки.

+0

его работающий штраф, но все еще повторяющиеся записи –

+0

Я думаю, что ваши данные образца не являются репрезентативными, например, что у вас есть как isActive = 0 и IsActive = 1 строки данных? – StuartLC

+0

да @stuartLC у меня есть оба areActive = 0 или isActive = 1 –

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