Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Добрый день!
Есть таблица :
Код Наим К-во ∑ Пост Маг
1 Товар 1 4 1111 Поставщик 1 MSK
2 Товар 2 3 222 Поставщик 1 MSK
3 Товар 3 18 333 Поставщик 1 MSK
4 Товар 4 20 2222 Поставщик 2 MSK
4 Товар 4 4 4111 Поставщик 1 MSK
5 Товар 5 15 6000 Поставщик 1 MSK
1 Товар 1 4 7889 Поставщик 1 SPB
2 Товар 2 13 9778 Поставщик 1 SPB
3 Товар 3 18 11667 Поставщик 1 SPB
4 Товар 4 120 13556 Поставщик 2 SPB
4 Товар 4 14 15445 Поставщик 1 SPB

Не могу победить отображение партионности товара.
Когда делаю группировку по Коду, ругается на колонку Пост (из-за того что один товар могут возить разные поставщики)
Подскажите как сделать группировку так, чтобы Код товара по каждому магазину не был задвоен ?( суммировался остаток по сумме и к-ву, а поставщик записывался через запятую или первый который привез товар)
22 авг 19, 12:24    [21955310]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
max([Пост]) as [Поставщик]


если нужны все поставщики , то ищите про string_agg()
22 авг 19, 12:27    [21955315]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Спасибо, поищу

SELECT code as "Код" ,
otd AS "Отдел", g_n as "Наим", 
amount as "Сумма", qty as "Количество", market as "Маг"
FROM 
Trade1
WHERE 
DAY(date_end) = (DAY(GETDATE())-1) 
AND otd ='Бакалея'
AND market='MSK'
GROUP BY code


Запрос ругается не только на поставщика, но и на все остальные колонки.
Я так понимаю, все оборачивать в MAX ([dep]) сразу после селекта?
22 авг 19, 12:39    [21955333]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
или CTE, ищите по форуму
22 авг 19, 13:04    [21955363]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Не помогает MAX() , прописывал Group BY - без ошибки, но та же выборка где берется количество только по одному поставщику.
Форум перечитал, опробовал EXISTS но толку 0 - не могу понять как втулить проверку наличия на одном маркете одного товара от разных поставщиков. А точнее не понимаю как вывод использовать.
22 авг 19, 16:07    [21955673]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
сделайте нормальные скрипты заполнения таблицы и какой результат вы хотите получить
22 авг 19, 16:11    [21955683]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
Egor111
Я так понимаю, все оборачивать в MAX ([dep]) сразу после селекта?
А смысл какой? Нафига выводить "какое-нибудь" значение из группы? Уберите вообще поля, которые варьируют в группе, из списка вывода. А те, которые строго соответствуют коду (скажем, наименование), добавьте в выражения группировки.

И зачем вообще группировка, если нет ни одной агрегатной функции?

Egor111
отображение партионности товара

А это что вообще такое - партионность? в текущем понимании...
22 авг 19, 16:16    [21955692]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Хочу получить список товаров у которых общий остаток на каждом магазине меньше 5 штук
Желаемый вывод:
Код | Наим | К-во | Сумма | Поставщики(хоть как-то) | Магазин

Партионность - имеется ввиду по товару - одна партия от одного поставщика вторая от другого, а товар один и тот же
Поставщика выбросить не могу - придется грузить и обрабатывать отчеты в Экселе минут 40, а тогда пропадает вообще смысл выгрузки через SQL если придется все руками делать.
Вариантов кода за два дня немеряно, вот один из вариантов без мусора:


SELECT code as "Код" ,
g_n as "Наим", 
SUM(qty) as "Количество",
SUM(amount) as "Сумма",
Post as "Поставщик"
market as "Маг",
otd AS "Отдел"
FROM 
Trade1
WHERE 
DAY(date_end) = (DAY(GETDATE())-1) 
AND otd ='Бакалея'
AND market='MSK'
AND qty <5.0001
GROUP BY code                 (здесь хоть что добавляй, все равно в выгрузке будет  [u]Товар 4 по Поставщику 1 в МСК[/u], хотя общий остаток 24 штуки)
22 авг 19, 16:52    [21955754]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
сделайте тестовую данные + желаемый результат данных, чтобы вам могли помочь, а то ваши объяснения очень туманны
22 авг 19, 16:53    [21955757]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Приложил файл, думаю должно стать понятно

К сообщению приложен файл (Q.xlsx - 10Kb) cкачать
22 авг 19, 17:18    [21955783]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
вы не поняли, пррочитайте тему как надо формлять сообщения в форуме.

нужно что-то типа такого:

declare @t table(id int, ...)
insert into @t(id...) values(1,...),(2, ....);
22 авг 19, 17:31    [21955795]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Egor111
Приложил файл, думаю должно стать понятно

у вас ошибка в примере, куда строка делась?
22 авг 19, 17:35    [21955800]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
для пользователей

+
drop table #d
select *
into #d
from (
			select 1 as code	,'Сахар' as g_n	,4 as qty	,40	as amount	,'Веселка' as Post	,'MSK' as market	,'Бакалея' as otd	,convert(datetime,'20190822') as date_end union all
			select 2			,'Мука'			,3			,60				,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 3			,'Тосол'		,19			,570			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 4			,'Соль'			,2			,80				,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 4			,'Соль'			,1			,50				,'Моркин'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 5			,'Гречка'		,19			,1140			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 6			,'Горох'		,22			,1540			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 7			,'Банка 3 л'	,44			,3520			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 8			,'Банка 5 л'	,8			,720			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 25136		,'Половник'		,15			,1500			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 12468		,'Ложка'		,28			,3080			,'Веселка'			,'MSK'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 1			,'Сахар'		,22			,220			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 2			,'Мука'			,18			,360			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 3			,'Тосол'		,216		,6480			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 4			,'Соль'			,131		,5240			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 4			,'Соль'			,1			,50				,'Моркин'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 5			,'Гречка'		,64			,3840			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 6			,'Горох'		,12			,840			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 7			,'Банк 3 л'		,16			,1280			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 8			,'Банка 5 л'	,1			,90				,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 25136		,'Половник'		,16			,1600			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end union all
			select 12468		,'Ложка'		,16			,1760			,'Веселка'			,'SPB'				,'Бакалея'			,convert(datetime,'20190822') as date_end
	) as t																				


Сообщение было отредактировано: 22 авг 19, 17:51
22 авг 19, 17:42    [21955806]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Egor111
а поставщик записывался через запятую или первый который привез товар)


Если я правильно понял вы хотите вытащить

(1 Товар 1 4 1111 Поставщик 1 MSK) + (1 Товар 1 4 7889 Поставщик 1 SPB)
(2 Товар 2 3 222 Поставщик 1 MSK) + (2 Товар 2 13 9778 Поставщик 1 SPB)
(3 Товар 3 18 333 Поставщик 1 MSK) + (3 Товар 3 18 11667 Поставщик 1 SPB)
(4 Товар 4 20 2222 Поставщик 2 MSK) + (4 Товар 4 4 4111 Поставщик 1 MSK) + (4 Товар 4 120 13556 Поставщик 2 SPB) + (4 Товар 4 14 15445 Поставщик 1 SPB)
(5 Товар 5 15 6000 Поставщик 1 MSK)

это уже не группировка, а джойн. Не получите вы поставщика(ов) без джойна.
Но вы можете сгруппировать без поставщика по товару, да.
22 авг 19, 18:05    [21955828]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Konst_One,
я бы составил запрос на создание таблицы - исходника как написано в правилах, но боюсь тема перейдет из русла о том как я неправильно создаю тему в обсуждение неправильного запроса создания :)

Focha,
Какая строка? Ошибок вроди нет в таблице-примере.

PizzaPizza,
Спасибо, попробую погуглить как сюда join втулить.
Не совсем - я хочу получить список товаров у которых общий остаток каждой единицы товара на каждом магазине меньше 5 штук.
(4 Соль возит в СПБ два поставщика, выборка показывает "4 Соль 131 5240 Веселка SPB Бакалея 22.авг" хотя общее количество Соли на магазине 132 шт.)
При группировке не срабатывает условие на сумму.
23 авг 19, 08:41    [21956174]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
Egor111
Member

Откуда:
Сообщений: 11
Спустя пару рабочих дней, для тех, кто ищет решение, а не советы по созданию тем, или комментарии по исходникам :) :

SELECT code as "Код" ,
g_n as "Наим", 
SUM(qty) as "Количество",
SUM(amount) as "Сумма",
MAX(Post) as "Поставщик"
market as "Маг",
otd AS "Отдел"
FROM 
Trade1
WHERE 
DAY(date_end) = (DAY(GETDATE())-1) 
AND otd ='Бакалея'
AND market='MSK'
GROUP BY code
HAVING SUM(qty) BETWEEN 0.0001 AND 5.0001 


Просто надо было добавить "HAVING" + "SUM"
Еще может быть полезна функция GROUP_CONCAT если версия сервера позволит : " SELECT code as "Код" ,
g_n as "Наим",
SUM(qty) as "Количество",
SUM(amount) as "Сумма",
GROUP_CONCAT (Post , ', ') as "Поставщик" "

Если не работает GROUP_CONCAT то можно взять :
SELECT code as "Код" ,
g_n as "Наим", 
SUM(qty) as "Количество",
SUM(amount) as "Сумма",
STUFF(
             (
SELECT distinct ', ' + t2.Post       FROM Trade1 t2
              where t1.code = t2.code AND DAY(date_end) = (DAY(GETDATE())-1)
              FOR XML PATH ('') )      , 1, 1, '')  AS "Поставщик" ,
market as "Маг",
otd AS "Отдел"

FROM 
Trade1 t1
26 авг 19, 17:05    [21957781]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Egor111
поставщик записывался через запятую или первый который привез товар)

Ну вы же понимаете, что это ваше условие не работает, если вы пишете
MAX(Post) as "Поставщик"

это не через запятую и не первый, это случайный.

А по поводу
BETWEEN 0.0001 AND 5.0001 

У вас поставщики присылают товар с размерностью десятитысячных (35.0854 банок варенья) или вы просто скопировали откуда то не подумав?
26 авг 19, 17:53    [21957814]     Ответить | Цитировать Сообщить модератору
 Re: Двойная группировка запроса  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Egor111
Еще может быть полезна функция GROUP_CONCAT


Нет такой функции в этом сервере.

string_agg() вам предложили в первом же комментарии
26 авг 19, 17:57    [21957818]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить