запрос с группой по количеству, а также приносит количество всех записей в таблице объявлений - PullRequest
1 голос
/ 30 июня 2019

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

Спасибо

select count(*),master_category,count(a2.adid) from ad a1
inner join Category c on a1.catid=c.id
inner join ad a2 on a1.adid=a2.adid
group by c.master_category

Ответы [ 4 ]

1 голос
/ 30 июня 2019

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

    select  t1.master_category, t1.count_by_cat, t2.tot_count
    from  (
    select  master_category,count(a2.adid) count_by_cat 
    from ad a1
    inner join Category c on a1.catid=c.id
    inner join ad a2 on a1.adid=a2.adid
    group by c.master_category )
    ) t1
    cross join  (
        select count(*) tot_count
        inner join Category c on a1.catid=c.id
        inner join ad a2 on a1.adid=a2.adid
    ) t2 

Перекрестное соединение - это декартово произведение между двумя наборами строк. В этом случае один набор предназначен для результата категорий, а второй - только в одной строке

тогда использование перекрестного соединения с общим результатом позволяет показать для каждой строки один и тот же результат .. (в этом случае общее значение рассчитывается по второму подзапросу)
Фактически это соединение между результатом для каждой строки категории и одним значением

0 голосов
/ 01 июля 2019

Я просто изменил ваш запрос, надеюсь, это поможет вам

select count(
    select * from ad a1
    inner join Category c on a1.catid=c.id
    inner join ad a2 on a1.adid=a2.adid) as Total,master_category,count(a2.adid) from ad a1
    inner join Category c on a1.catid=c.id
    inner join ad a2 on a1.adid=a2.adid
    group by c.master_category
0 голосов
/ 30 июня 2019

Использовать оконные функции:

select c.master_category, count(*) as category_cnt,
       sum(count(*)) over () as total_cnt
from ad a inner join
     Category c
     on a.catid = c.id
group by c.master_category;

Я не понимаю, почему вы присоединяетесь к ad дважды. Это должен быть не только самый простой подход, но и наилучший результат для того, что вы хотите сделать.

0 голосов
/ 30 июня 2019

Попробуйте что-то вроде этого:

select c.master_category, 
       count(a1.adid) as countGroup, 
       min(a2.count1) as countAll
from ad a1
inner join Category c on a1.catid=c.id
left join (select count(ad.someColumn) as count1 from ad) as a2 on a2.adid = a1.adai
group by c.master_category
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...