Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11561 |
max([Пост]) as [Поставщик] если нужны все поставщики , то ищите про string_agg() |
22 авг 19, 12:27 [21955315] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11561 |
или CTE, ищите по форуму |
22 авг 19, 13:04 [21955363] Ответить | Цитировать Сообщить модератору |
Egor111 Member Откуда: Сообщений: 11 |
Не помогает MAX() , прописывал Group BY - без ошибки, но та же выборка где берется количество только по одному поставщику. Форум перечитал, опробовал EXISTS но толку 0 - не могу понять как втулить проверку наличия на одном маркете одного товара от разных поставщиков. А точнее не понимаю как вывод использовать. |
22 авг 19, 16:07 [21955673] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11561 |
сделайте нормальные скрипты заполнения таблицы и какой результат вы хотите получить |
22 авг 19, 16:11 [21955683] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
И зачем вообще группировка, если нет ни одной агрегатной функции?
А это что вообще такое - партионность? в текущем понимании... |
||||
22 авг 19, 16:16 [21955692] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11561 |
сделайте тестовую данные + желаемый результат данных, чтобы вам могли помочь, а то ваши объяснения очень туманны |
22 авг 19, 16:53 [21955757] Ответить | Цитировать Сообщить модератору |
Egor111 Member Откуда: Сообщений: 11 |
Приложил файл, думаю должно стать понятно К сообщению приложен файл (Q.xlsx - 10Kb) cкачать ![]() |
22 авг 19, 17:18 [21955783] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11561 |
вы не поняли, пррочитайте тему как надо формлять сообщения в форуме. нужно что-то типа такого: declare @t table(id int, ...) insert into @t(id...) values(1,...),(2, ....); |
22 авг 19, 17:31 [21955795] Ответить | Цитировать Сообщить модератору |
Focha Member Откуда: Москва Сообщений: 553 |
у вас ошибка в примере, куда строка делась? |
||
22 авг 19, 17:35 [21955800] Ответить | Цитировать Сообщить модератору |
Focha Member Откуда: Москва Сообщений: 553 |
для пользователей
Сообщение было отредактировано: 22 авг 19, 17:51 |
|
22 авг 19, 17:42 [21955806] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 415 |
Если я правильно понял вы хотите вытащить (1 Товар 1 4 1111 Поставщик 1 MSK) + (1 Товар 1 4 7889 Поставщик 1 SPB) это уже не группировка, а джойн. Не получите вы поставщика(ов) без джойна. Но вы можете сгруппировать без поставщика по товару, да. |
||
22 авг 19, 18:05 [21955828] Ответить | Цитировать Сообщить модератору |
Egor111 Member Откуда: Сообщений: 11 |
Konst_One, я бы составил запрос на создание таблицы - исходника как написано в правилах, но боюсь тема перейдет из русла о том как я неправильно создаю тему в обсуждение неправильного запроса создания :) Focha, Какая строка? Ошибок вроди нет в таблице-примере. PizzaPizza, Спасибо, попробую погуглить как сюда join втулить. Не совсем - я хочу получить список товаров у которых общий остаток каждой единицы товара на каждом магазине меньше 5 штук. (4 Соль возит в СПБ два поставщика, выборка показывает "4 Соль 131 5240 Веселка SPB Бакалея 22.авг" хотя общее количество Соли на магазине 132 шт.) При группировке не срабатывает условие на сумму. |
23 авг 19, 08:41 [21956174] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 415 |
Ну вы же понимаете, что это ваше условие не работает, если вы пишете MAX(Post) as "Поставщик" это не через запятую и не первый, это случайный. А по поводу BETWEEN 0.0001 AND 5.0001 У вас поставщики присылают товар с размерностью десятитысячных (35.0854 банок варенья) или вы просто скопировали откуда то не подумав? |
||
26 авг 19, 17:53 [21957814] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 415 |
Нет такой функции в этом сервере. string_agg() вам предложили в первом же комментарии |
||
26 авг 19, 17:57 [21957818] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |