ВЫБРАТЬ * ИЗ таблицы в дополнение к функции агрегирования

#sql #join #aggregation

#sql #Присоединиться #агрегирование

Вопрос:

Краткий контекст: Я хотел бы показать список всех компаний, за исключением тех, которые относятся к сектору «оборона» или «правительство», и их общую сумму, потраченную на учебные занятия. Должны отображаться только компании, общая сумма которых превышает 1000.

Итак, я написал следующий запрос:

 SELECT NAME, ADDRESS, ZIP_CODE, CITY, SUM(FEE-PROMOTION) AS "Total spent on training at REX"
FROM COMPANY INNER JOIN PERSON ON (COMPANY_NUMBER = EMPLOYER) INNER JOIN ENROLLMENT ON (PERSON_ID = STUDENT)
WHERE SECTOR_CODE NOT IN (SELECT CODE 
              FROM SECTOR 
              WHERE DESCRIPTION = 'Government' OR DESCRIPTION = 'Defense')
GROUP BY NAME, ADDRESS, ZIP_CODE, CITY
HAVING SUM(FEE-PROMOTION) > 1000
ORDER BY SUM(FEE-PROMOTION) DESC
  

Теперь, что мне действительно нужно, вместо определения каждого отдельного столбца в таблице COMPANY, я хотел бы показать ВСЕ столбцы таблицы COMPANY с помощью * .

 SELECT * (all tables from COMPANY here), SUM(FEE-PROMOTION) AS "Total spent on training at REX"
FROM COMPANY INNER JOIN PERSON ON (COMPANY_NUMBER = EMPLOYER) INNER JOIN ENROLLMENT ON (PERSON_ID = STUDENT)
WHERE SECTOR_CODE NOT IN (SELECT CODE 
              FROM SECTOR 
              WHERE DESCRIPTION = 'Government' OR DESCRIPTION = 'Defense')
GROUP BY * (How to fix it here?)
HAVING SUM(FEE-PROMOTION) > 1000
ORDER BY SUM(FEE-PROMOTION) DESC
  

Я мог бы определить каждый отдельный столбец из COMPANY в SELECT, и это решение выполнит эту работу (как в первом примере), но как я могу сократить запрос, используя «ВЫБРАТЬ * из таблицы COMPANY»?

Комментарии:

1. С помощью этого: SELECT COMPANY.*

2. Образцы данных и желаемые результаты действительно помогли бы. Какую базу данных вы используете?

Ответ №1:

Ключевая идея заключается в суммировании в подзапросе, чтобы получить общие расходы для компании. Это позволяет удалить агрегацию из внешнего запроса:

 select c.*, pe.total_spend
from company c join
     sector s
     on c.sector_code = s.code left join
     (select p.employer, sum(e.fee - e.promotion) as training_spend
      from person p join
           enrollment e
           on p.person_id = e.student
      group by p.employer
     ) pe
     on pe.employer = c.company_number
where s.sector not in ('Government', 'Defense') and
      pe.total_spend > 1000