powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL запрос требует доработки
16 сообщений из 16, страница 1 из 1
SQL запрос требует доработки
    #40069252
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
У меня есть база данных с чеками нескольких магазинов. Мне нужно их сгруппировать по критерию суммы.
Небольшая часть базы данных выглядит следующим образом (в самой базе сотни тысяч строк:

Кнк/бмр-0000001 2021-01-02 09:51:20.240 бмр 97.00
Кнк/бмр-0000002 2021-01-02 09:51:50.517 бмр 96.00
Кнк/скв-0000001 2021-01-02 09:52:19.810 скв 104.00
Кнк/бмр-0000003 2021-01-02 09:52:26.153 бмр 480.00
Кнк/скв-0000003 2021-01-02 09:53:00.747 скв 39.00
Кнк/бмр-0000004 2021-01-02 09:53:07.090 бмр 15.00
Кнк/жкт-0000001 2021-01-02 09:56:13.003 жкт 139.00
Кнк/жкт-0000002 2021-01-02 09:56:49.270 жкт 41.00
Кнк/жкт-0000009 2021-01-02 09:57:27.777 скв 59.00
Кнк/жкт-0000003 2021-01-02 09:57:34.550 жкт 35.00
Кнк/жкт-0000005 2021-01-02 09:58:22.613 жкт 123.00

Сам код для выгрузки этих данных

SELECT
doc_cnt = docs1.name, --если уникальные
Year_manth = docs1.created,
Market = m.doc_prefix,
summa = docs1.amount_nds
FROM student.docs1 WITH (NOLOCK)
LEFT JOIN student.dbo.markets m WITH (NOLOCK) ON docs1.market_id=m.market_id
WHERE doc_type_id IN (8001,8101,8201) -- типы документов, смотри таблицу docs_types
AND docs1.created >='20210101' -- универсальный тип даты
AND docs1.status_id = 1


Итого составили код, который группирует чеки по категории суммы - amount_nds. Но он просто суммирует всю сумму чеков по максимуму в последнюю категорию - более $20000, а не ранжирует по каждому чеку.
Пример кода:

SELECT
doc_cnt = COUNT (d.name), --если уникальные
Year_manth = FORMAT (d.created, 'MMM yyyy'),
Market = m.doc_prefix,
doc_id = CASE WHEN SUM(d.amount_nds) <= 0 THEN 'ERROR'
WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'
WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'
WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'
ELSE 'Over $20000' END
FROM student.dbo.docs1 d WITH (NOLOCK)
LEFT JOIN student.dbo.markets m WITH (NOLOCK) ON d.market_id=m.market_id
WHERE doc_type_id IN (8001,8101,8201) -- типы документов, смотри таблицу docs_types
AND d.created >='20210101' -- универсальный тип даты
AND d.status_id = 1
GROUP BY m.doc_prefix, FORMAT (created, 'MMM yyyy')


Прилагаю часть данных, выгруженных этим кодом:

doc_cnt Year_manth Market doc_id

26850 May 2021 бмр Over $20000
92240 Mar 2021 скв Over $20000
71041 Jan 2021 бмр Over $20000
1 Apr 2021 фбр Over $20000
74797 Feb 2021 скв Over $20000
94061 Apr 2021 скв Over $20000
47130 Mar 2021 кгб Over $20000
85160 Apr 2021 бмр Over $20000
13568 May 2021 жкт Over $20000
31804 May 2021 скв Over $20000
68615 Feb 2021 бмр Over $20000
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069260
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложите пример исходных данных в виде CREATE TABLE + INSERT INTO (и используйте тег SRC). Либо создайте online fiddle и дайте ссылку.
Покажите требуемый ответ для именно этих данных. С подробным пояснением для 1-2 строк результата, ссылаясь на конкретные исходные значения.
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069275
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Прикладываю коды из программы MSQL и таблицу Excel с необходимым готовым результатом
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069276
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069284
stdvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gerzzog,

Это нужно вынести в группировку:
Код: sql
1.
2.
3.
4.
5.
CASE WHEN SUM(d.amount_nds) <= 0 THEN 'ERROR'
WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'
WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'
WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'
ELSE 'Over $20000' END 
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069290
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можете, пожалуйста, указать точнее в формате кода, а то я если просто переношу этот код
в группировку после

GROUP BY m.doc_prefix, FORMAT (created, 'MMM yyyy')

выдает ошибку. Наверное есть тонкости, которые я делаю неправильно
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069382
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложил измененный код. Выдает ошибку:
Msg 144, Level 15, State 1, Line 16
Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069853
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может есть идеи,что сделано неверно в коде?
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069855
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog
Может есть идеи,что сделано неверно в коде?

В генетическом коде ошибка.

1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT
	doc_cnt			= COUNT (d.name),	--если уникальные
    Year_manth		= FORMAT (d.created, 'MMM yyyy'),
	Market			= m.doc_prefix,

 Сумма = SUM(d.amount_nds),

	doc_id          = CASE WHEN SUM(d.amount_nds) <=  0 THEN 'ERROE'  
					 WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'  
					 WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'  
					 WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'  
					 ELSE 'Over $20000' END 
FROM ryaba.docs1 d WITH (NOLOCK)
LEFT JOIN ryaba.dbo.markets m WITH (NOLOCK) ON d.market_id=m.market_id
WHERE doc_type_id IN (8001,8101,8201)		-- типы документов, берем только определенные чеки
	AND d.created >='20210101'				-- универсальный тип даты
	AND d.status_id = 1						-- берем только проведенные чеки (0 - удаленные не учитываем)
GROUP BY m.doc_prefix, FORMAT (created, 'MMM yyyy')



Опосля чего смотришь на Сумма и чешешЪ репу.
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069872
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
Да, уже видел этот результат:( он просто полностью суммирует и группирует только по маркетам и месяцам. Нужна еще группировка
по условию в конце:

CASE WHEN SUM(d.amount_nds) <= 0 THEN 'ERROE'
WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'
WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'
WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'
ELSE 'Over $20000' END

Но у меня не получается ее добавить. Что-то с синтаксисом неправильно
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069888
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если в конце в группировку добавить:

GROUP BY m.doc_prefix, FORMAT (created, 'MMM yyyy'), doc_id

то он просто все чеки подряд по порядку выложит, но не просуммирует внутри категорий(
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069895
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog
aleks222,
Да, уже видел этот результат:( он просто полностью суммирует и группирует только по маркетам и месяцам. Нужна еще группировка
по условию в конце:

CASE WHEN SUM(d.amount_nds) <= 0 THEN 'ERROE'
WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'
WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'
WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'
ELSE 'Over $20000' END

Но у меня не получается ее добавить. Что-то с синтаксисом неправильно


С генетическим кодом большие проблемы.
ЭТО
Код: sql
1.
2.
3.
4.
5.
CASE WHEN SUM(d.amount_nds) <=  0 THEN 'ERROE'  
					 WHEN SUM(d.amount_nds) < 1000 THEN 'Under $1000'  
					 WHEN SUM(d.amount_nds) >= 1000 and SUM(d.amount_nds) < 5000 THEN 'Under $5000'  
					 WHEN SUM(d.amount_nds) >= 5000 and SUM(d.amount_nds) < 20000 THEN 'Under $20000'  
					 ELSE 'Over $20000' END


НЕ условие.

Ты, страдалец, СЛОВАМИ могешь описать "чего тебе надо"?
Т.е. объяснить СУММА ЧЕГО должна быть?
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069922
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно, чтобы запрос брал один чек и по сумме относил его к категории до 1000 у.е., от 1000 и до 5000 и т.д. И
потом нужно, чтобы он брал чеки одной и той же категории и подсчитывал их общее количество и сумму чтобы был примерно такой ответ:

Количество чеков Маркет Месяц Категория
256 СБР Янв.2021 до 1000 у.е.
556 СБР Янв.2021 1000-5000у.е.


Сейчас же запрос делает немного по другому. Он по сути ранжирует как надо, если не группировать. А если группировку
добавить, то он суммирует все суммы чеков по маркетам в пределах месяца и на эту сумму ставит ранг > 20 000 у.е.

Количество чеков Маркет Месяц Категория
1256 СБР Янв.2021 > 20 000 у.е.
54364 МКР Янв.2021 > 20 000 у.е.
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069926
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикладывал файл, какой результат хочется получить
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069964
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gerzzog
Мне нужно, чтобы запрос брал один чек и по сумме относил его к категории до 1000 у.е., от 1000 и до 5000 и т.д. И
потом нужно, чтобы он брал чеки одной и той же категории и подсчитывал их общее количество и сумму чтобы был примерно такой ответ:

Количество чеков Маркет Месяц Категория
256 СБР Янв.2021 до 1000 у.е.
556 СБР Янв.2021 1000-5000у.е.


Сейчас же запрос делает немного по другому. Он по сути ранжирует как надо, если не группировать. А если группировку
добавить, то он суммирует все суммы чеков по маркетам в пределах месяца и на эту сумму ставит ранг > 20 000 у.е.

Количество чеков Маркет Месяц Категория
1256 СБР Янв.2021 > 20 000 у.е.
54364 МКР Янв.2021 > 20 000 у.е.



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with t as (SELECT d.created
	            , m.doc_prefix
                , d.amount_nds
	            , doc_id = CASE WHEN d.amount_nds <=    0 THEN -1 
                                WHEN d.amount_nds <  1000 THEN 1000  
                                WHEN d.amount_nds <  5000 THEN 5000  
                                WHEN d.amount_nds < 20000 THEN 20000  
                                ELSE 100000
                           END 
             from ryaba.docs1 d WITH (NOLOCK)
                  LEFT JOIN ryaba.dbo.markets m WITH (NOLOCK) ON d.market_id=m.market_id
            WHERE doc_type_id IN (8001,8101,8201)		-- типы документов, берем только определенные чеки
	        AND d.created >='20210101'				-- универсальный тип даты
	        AND d.status_id = 1						-- берем только проведенные чеки (0 - удаленные не учитываем)
          )

select Year = year(created)
     , month = month(created),
	 , Market = doc_prefix
	 , doc_id
     , doc_cnt = COUNT(*)
     , Сумма = SUM(amount_nds)
  from t
GROUP BY doc_prefix
       , year(created)
       , month(created)
       , doc_id
;
...
Рейтинг: 0 / 0
SQL запрос требует доработки
    #40069969
gerzzog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое человеческое спасибо!!! Работает отлично
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL запрос требует доработки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]