SQL выберите максимальное значение суммы

Я новичок в форуме и SQL и очень ценю всю информацию. Я не мог найти решение, которое работает для меня, уже рассмотренного, поэтому подумал, что попробую здесь. Работа в Снежинке. Мой набор данных выглядит так (извиняюсь за неудобное форматирование):

PO  | DIV | PROD |  QTY |   CUST
123 | 1  | x |  10 |    Sonic
234 |   1 | x   | 9 |   Sonic
345 | 1 |   x | 8   | McD
456 | 1 | x | 10    | Wendy's

Я хотел бы суммировать QTY по DIV, PROD и CUST. Как только я получу эти суммированные количества, я хотел бы взять наибольшую СУММУ (КОЛ-ВО) по DIV и PROD, но сохранить поле CUST. Таким образом, ответ из приведенного выше будет выглядеть так:

1 | x | 19| Sonic

Просто обратите внимание, у меня, очевидно, есть гораздо большая база данных, так что у меня будут все уникальные комбинации продуктов / делений с указанным max (sum ()), около 600K строк.

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

SELECT DIV, PROD, CUST, SUM(QTY) as QTY
from table
GROUP BY 
    DIV,
    PROD,
    CUST
Order by 
    DIV,
    PROD

РЕДАКТИРОВАТЬ: подход Джея CTE сработал для меня, но я забыл упомянуть, что хотел бы создать из этого таблицу. СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТАБЛИЦУ не работает с CTE. Есть ли способы создать таблицу с использованием подхода CTE или другого подхода?

Спасибо!


person David Dance    schedule 27.03.2018    source источник
comment
SQL Server, MySQL или другой сервер?   -  person DineshDB    schedule 27.03.2018
comment
другие, но основанные на SQL, насколько мне известно. Это снежинка   -  person David Dance    schedule 27.03.2018
comment
Обратите внимание: SO (и другие сайты StackExchange) - это не форум, а сайт вопросов и ответов. Разъяснения следует вносить в исходный вопрос, а не публиковать в виде комментариев. См. Справку сайта (ссылки находятся в разных местах на странице, включая меню SE, которое открывается из значка SE в правом верхнем углу) для получения дополнительной информации, в том числе о том, как форматировать вопросы и ответы.   -  person outis    schedule 27.03.2018
comment
Используя подход Джея CTE, вы можете запустить запрос, а затем сохранить результаты в таблице в Snowflake на следующем шаге: CREATE TABLE <new_table> AS select * from table(result_scan(last_query_id()))   -  person Stuart Ozer    schedule 28.03.2018


Ответы (4)


MYSQL

SELECT `DIV`, PROD, CUST,QTY from 
(
SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD
) AS T
WHERE QTY=(SELECT MAX(QTY) FROM (SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD) AS T)

OR

SELECT `DIV`, PROD, CUST,QTY from 
(
SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD
) AS T ORDER BY QTY DESC LIMIT 1;

Живая демонстрация

http://sqlfiddle.com/#!9/f945c2b/19

SQL-СЕРВЕР

Использование CTE

WITH CTE AS
(
 SELECT DIV, PROD, CUST, SUM(QTY) as QTY,
 DENSE_RANK() OVER (PARTITION BY DIV, PROD ORDER BY SUM(QTY) DESC) AS Rank
 FROM 
 table1 
 GROUP BY DIV, PROD, CUST
)
SELECT DIV, PROD, CUST,QTY FROM CTE
WHERE Rank=1
ORDER BY DIV, PROD

Использование вложенного запроса

SELECT DIV, 
       PROD, 
       CUST,
       QTY 
FROM ( 
      SELECT DIV, PROD, CUST, SUM(QTY) as QTY, 
      DENSE_RANK() OVER (PARTITION BY DIV, PROD ORDER BY SUM(QTY) DESC) AS Rank
      FROM table1 
      GROUP BY DIV, PROD, CUST )AS T1 
 WHERE Rank=1 ORDER BY DIV, PROD;

Живая демонстрация

http://sqlfiddle.com/#!18/22001/11

person Jay Shankar Gupta    schedule 27.03.2018
comment
Спасибо, Джей! Когда я запускаю это, я получаю сообщение об ошибке: Ошибка компиляции SQL: [T.DIV] не является допустимой группой по выражению - person David Dance; 27.03.2018
comment
Snowflake поддерживает оконные функции (как показано в примере dense_rank()) - person Paul Maxwell; 27.03.2018
comment
Джей, когда я запустил ваш код, у меня была только одна строка, я предполагаю, что это максимальное (QTY) наблюдение по всем наблюдениям. Я ищу максимальное значение, но сгруппированное по DIV и PROD, в результате получается 10 строк, если у меня есть 10 уникальных комбинаций DIV / PROD, например - person David Dance; 27.03.2018
comment
DENSE_RANK() OVER (PARTITION BY DIV, PROD ORDER BY SUM(QTY) DESC) AS Rank Попробуйте DENSE_RANK() с разделом, как указано выше - person Jay Shankar Gupta; 27.03.2018
comment
Обновление DENSE_RANK () очень помогло. Похоже, это дало мне ответ. Большое спасибо! - person David Dance; 27.03.2018
comment
Добро пожаловать!! @DavidDance - person Jay Shankar Gupta; 27.03.2018
comment
@Jay Shankar Gupta Еще одна вещь, которую я хотел сделать, - это создать таблицу в конце этого. Похоже, я не могу использовать CREATE TABLE в начале с CTE. Есть ли обходной путь? - person David Dance; 27.03.2018
comment
SELECT DIV, PROD, CUST,QTY INTO new_table From ( SELECT DIV, PROD, CUST, SUM(QTY) as QTY, DENSE_RANK() OVER (ORDER BY SUM(QTY) DESC) AS Rank FROM table1 GROUP BY DIV, PROD, CUST )AS T1 WHERE Rank=1 ORDER BY DIV, PROD; Вы можете использовать вложенный запрос - person Jay Shankar Gupta; 27.03.2018

Вы можете отфильтровать свою совокупную sum(qty) с помощью предложения having

select 
       DIV, PROD, CUST, SUM(QTY) as QTY 
from table
group by DIV, PROD, CUST
having sum(QTY) = ( select max(QTY) from (
                    select sum(QTY) as QTY from table
                    group by DIV, PROD, CUST)a)
person Yogesh Sharma    schedule 27.03.2018
comment
Спасибо, Йогеш, что-то в этом может не поддерживаться в Snowflake, поскольку я получаю сообщение об ошибке: неподдерживаемый тип подзапроса не может быть оценен - person David Dance; 27.03.2018

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

SELECT A.`DIV`, A.PROD, IF(A.`DIV`=0,'NAN',A.AGG_QTY/A.`DIV`) QTY, A.CUST
FROM (SELECT `DIV`, PROD, CUST, SUM(QTY) AGG_QTY
      FROM `TABLE` 
      GROUP BY `DIV`, PROD, CUST
      ORDER BY SUM(QTY) DESC
      LIMIT 1) A;

Посмотрите, как это работает на SQL Fiddle

person cdaiga    schedule 27.03.2018

person    schedule
comment
MySqlDataAdapter sda = new MySqlDataAdapter (выберите Count (*) From login, где имя пользователя = '+ txtid.Text +' и пароль = '+ txtpass.Text +', соединение); DataTable dt = новый DataTable (); sda.Fill (dt); если (dt.Rows [0] [0] .ToString () == 1) {this.Hide (); Form2 ms = новый Form2 (); ms.Show (); } else {MessageBox.Show (проверьте свой идентификатор и пароль); }} - person heiae web; 27.03.2018
comment
ВЫБЕРИТЕ СУММУ (акции) как jumlahstock ИЗ barang Источник: dwirandyherdinanto.blogspot.co.id/2014/02/ - person heiae web; 27.03.2018