#sql-server #database #group-by
#sql-сервер #База данных #группировка по
Вопрос:
У меня есть два запроса group by и average, мне нужно получить оба результата вместе. Я имею в виду, предположим, что у меня есть два таких запроса:
select timespan, count(*) c1
from dbo
where C > 50
group by timespan
having count(*) > 100
и
select timespan, count(*) c2
from dbo
where C < 50
group by timespan
having count(*) > 130
ОТРЕДАКТИРОВАНО, мне нужно, чтобы оба были рядом друг с другом
TimeSpan, c1, c2
630, 120, 100
631, 140, 120
Это мой запрос в SQL Server, но он не работает:
select
gt, ls
from
(select count (*) gt
from dbo.Alltrips
where DrivingTime > 50
and CarId in (select CarId from dbo.Alltrips
group by CarId
having Count (*) > 100)
group by timeSpan) a,
(select count (*) ls
from dbo.Alltrips
where DrivingTime < 50
and CarId in (select CarId from dbo.Alltrips
group by CarId
having Count (*) > 130)
group by timeSpan) b
Комментарии:
1. Я изо всех сил пытаюсь понять, какого именно результата вы добиваетесь. Ваш фактический запрос не совпадает с первыми двумя, от которых, по вашим словам, вы хотите получить результаты одновременно. Не могли бы вы, возможно, объяснить словами результат, который вы пытаетесь получить?
2. мой последний большой запрос неверен, мне нужно объединить два первых запроса, но только с одним временным интервалом. Я отредактировал свой желаемый образец, пожалуйста, взгляните. Спасибо
3. Я понимаю первую часть. Но в вашем примере запроса у вас есть
having count(*) > 100
applied к внешнему запросу, но в вашем фактическом запросе он есть в подзапросе. Не зная точно, чего вы пытаетесь достичь, невозможно узнать, что правильно. Похоже (из вашего фактического запроса), что вы пытаетесь подсчитать количество автомобилей, которые совершили более 100 поездок в целом и совершили поездку с более чем 50 поездками за определенный промежуток времени?4. два первых запроса — это правильные запросы, которые я хочу, чтобы их результаты были объединены, вы просто игнорируете последний большой запрос. «подсчитайте количество автомобилей, которые совершили более 100 поездок в целом», ГДЕ C> 50 это первая часть, c1. вторая часть аналогична, которая имеет count(*) c2 .
Ответ №1:
Используйте условную агрегацию:
SELECT timespan,
COUNT(CASE WHEN C > 100 THEN 1 END) AS C1,
COUNT(CASE WHEN C > 130 THEN 1 END) AS C2
FROM dbo.dbo --Do you really have a table called dbo?
GROUP BY timespan
HAVING COUNT(CASE WHEN C > 100 THEN 1 END) > 100;
Комментарии:
1. Я думаю, что мои цифры сбивают с толку, я отредактировал. И никакой dbo — это просто гипотетическое название, 🙂 . спасибо
2. Затем измените цифры на то, что вам нужно @Azzurro94 . Я основал ответ на вашей оригинальной версии, однако изменить буквальное целое число очень просто.
3. я не понимаю, почему вы просто проверяете это при наличии, ИМЕЯ КОЛИЧЕСТВО (СЛУЧАЙ, КОГДА C> 100, ЗАТЕМ 1 КОНЕЦ)> 100; и я также изменил числа.
4. Потому что для вашего оригинала последнее было бы правдой, @Azzurro94 . Вы переместили целевые сообщения, но я не изменил ответ; хотя это показывает вам принцип, используйте условную агрегацию.
OR
Скорее всего, вам понадобится «сейчас».