Помогите, пожалуйста, не могу объединить два запроса в один. Каждый из них выводит строчку с нужными данными по итогу. А хочется в одну табличку из двух строчек. UNION не работает:
Первый:
select s_n_name, count(duration) as 'Количество', SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as 'Время'
from table where s_n='001111';
Второй:
select s_n_name, count(duration) as 'Количество', SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as 'Время'
from table where s_n='002222';
Группировка вас спасёт:
SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n IN('001111', '002222')
GROUP BY s_n;
Для отладки использовал такую временную таблицу:
CREATE TEMPORARY TABLE _table(s_n char(6), s_n_name char(14), duration TIME)
SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
SELECT '001111' s_n, 'name is 001111' s_n_name, '00:11:11' duration UNION ALL
SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
SELECT '002222' s_n, 'name is 002222' s_n_name, '00:22:22' duration UNION ALL
SELECT '003333' s_n, 'name is 003333' s_n_name, '00:33:33' duration UNION ALL
SELECT '003333' s_n, 'name is 003333' s_n_name, '00:33:33' duration;
Можно использовать union (я не понял, что там в нём у вас не работает), но это ад!
SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n = '001111'
UNION
SELECT s_n_name, COUNT(*) n, SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as t
FROM _table
WHERE s_n = '002222';
Можно воспользоваться оператором IN в WHERE, сгруппировав результаты по ключу:
select s_n_name,
count(duration) as cnt,
SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as `time`
from table where s_n IN ('001111', '002222')
group by s_n, s_n_name;
Либо OR, если нужны строго 2 результата:
select s_n_name,
count(duration) as cnt_dur,
SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='001111' OR s_n='002222'
group by s_n, s_n_name;
Группировка нужна, чтобы переопределить константную группировку аггрегатной функции COUNT
- без кастомной группировки результатом запроса всегда будет одна строка
Если нужно объединить результаты двух абстрактных запросов(более сложные условия) с одинаковой сигнатурой, воспользуйтесь union all
:
select s_n_name,
count(duration) as cnt,
SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='001111'
UNION ALL
select s_n_name,
count(duration) as cnt,
SEC_TO_TIME(sum(TIME_TO_SEC(duration))) as secs
from table where s_n='002222';
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Для MS SQL есть возможность установки TRANSACTION ISOLATION LEVEL в хранимых процедурахНапример:
Как понять причину deadlock'а - а именно, какие транзакции захватили какие блокировки?
Хочу добиться интерактивного взаимодействия с командной строкойДля этого использовал найденный в интернете класс SyncPipe