powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка
8 сообщений из 8, страница 1 из 1
Группировка
    #39664905
gigar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер.
Есть 3 таблицы номенклатура(nomenclature),заказы(orders),склад (storage)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DECLARE @nomenclature TABLE ( nomenclature_id INT, nomenclature_marka VARCHAR(100),nomenclature_model VARCHAR(100),nomenclature_type VARCHAR(100))
INSERT INTO @nomenclature 
VALUES
  ( 1, 'Audi','A6','салон' ),
  ( 2, 'Audi','Q5','салон' ),
  ( 3, 'Audi','Q5','багажник' ),
  ( 4, 'Audi','Q7','салон' )
  ;
DECLARE @orders TABLE ( orders_id INT, nomenclature_id INT,orders_qty INT )
INSERT INTO @orders 
VALUES
  ( 1, 1, 10 ),
  ( 2, 3, 4 )
;
DECLARE @storage TABLE ( storage_id INT, nomenclature_id INT,storage_qty INT )
INSERT INTO @storage 
VALUES
  ( 1, 1, 10 ),
  ( 2, 2, 9 ),
  ( 3, 3, 8 ),
  ( 4, 4, 7 )
;



Как получить следующее (т.е. склад - заказы с группировкой по nomenclature_marka и nomenclature_type ):
nomenclature_markaвсего салонвсего багажник всегоAudi16420

Спасибо.
...
Рейтинг: 0 / 0
Группировка
    #39664917
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gigarКак получить следующее (т.е. склад - заказы с группировкой по nomenclature_marka и nomenclature_type ):
Код: 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.
29.
30.
31.
32.
33.
DECLARE @nomenclature TABLE ( nomenclature_id INT, nomenclature_marka VARCHAR(100),nomenclature_model VARCHAR(100),nomenclature_type VARCHAR(100))
INSERT INTO @nomenclature 
VALUES
  ( 1, 'Audi','A6','салон' ),
  ( 2, 'Audi','Q5','салон' ),
  ( 3, 'Audi','Q5','багажник' ),
  ( 4, 'Audi','Q7','салон' )
  ;
DECLARE @orders TABLE ( orders_id INT, nomenclature_id INT,orders_qty INT )
INSERT INTO @orders 
VALUES
  ( 1, 1, 10 ),
  ( 2, 3, 4 )
;
DECLARE @storage TABLE ( storage_id INT, nomenclature_id INT,storage_qty INT )
INSERT INTO @storage 
VALUES
  ( 1, 1, 10 ),
  ( 2, 2, 9 ),
  ( 3, 3, 8 ),
  ( 4, 4, 7 )
;

select	n.nomenclature_marka, 
		sum(case when n.nomenclature_type = 'салон' then s.storage_qty else 0 end) - sum(case when n.nomenclature_type = 'салон' then o.orders_qty else 0 end) as [всего салон],
		sum(case when n.nomenclature_type = 'багажник' then s.storage_qty else 0 end) - sum(case when n.nomenclature_type = 'багажник' then o.orders_qty else 0 end) as [всего багажник],
		sum(s.storage_qty) - sum(o.orders_qty) as [Всего]
from @nomenclature n
	left join @orders o
		on o.nomenclature_id = n.nomenclature_id
	left join @storage s
		on s.nomenclature_id = n.nomenclature_id
group by n.nomenclature_marka
...
Рейтинг: 0 / 0
Группировка
    #39664944
gigar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что в таблице склад(storage) имеются записи(nomenclature_id), которых нет в заказах (orders).
А в заказах nomenclature_id может быть несколько раз одинаковые.
...
Рейтинг: 0 / 0
Группировка
    #39664947
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gigarПроблема в том, что в таблице склад(storage) имеются записи(nomenclature_id), которых нет в заказах (orders).
А в заказах nomenclature_id может быть несколько раз одинаковые.Эээ, разве у меня это не учитывается?

Вы поправьте тогда ваши тестовые данные для описанных вами случаев, посмотрим, поправим, если что не так.
...
Рейтинг: 0 / 0
Группировка
    #39664950
gigar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если продублировать последнюю строку в заказах, то вместо вычитания (склад-заказы) происходит ,почему-то,суммирование
...
Рейтинг: 0 / 0
Группировка
    #39665021
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select	n.nomenclature_marka, 
		sum(case when n.nomenclature_type = 'салон' then isnull(s.storage_qty,0) - isnull(o.orders_qty,0) else 0 end) as [всего салон],
		sum(case when n.nomenclature_type = 'багажник' then isnull(s.storage_qty,0) - isnull(o.orders_qty,0) else 0 end) as [всего багажник],
		sum(isnull(s.storage_qty,0) - isnull(o.orders_qty,0)) as [Всего]
from @nomenclature n
	outer apply(Select Sum(orders_qty) as orders_qty from @orders o Where o.nomenclature_id = n.nomenclature_id) o
	outer apply(Select Sum(storage_qty) as storage_qty from @storage s Where s.nomenclature_id = n.nomenclature_id) s
Group by n.nomenclature_marka



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select	n.nomenclature_marka, 
		sum(case when n.nomenclature_type = 'салон' then isnull(os.storage_qty,0) - isnull(os.orders_qty,0) else 0 end) as [всего салон],
		sum(case when n.nomenclature_type = 'багажник' then isnull(os.storage_qty,0) - isnull(os.orders_qty,0) else 0 end) as [всего багажник],
		sum(isnull(os.storage_qty,0) - isnull(os.orders_qty,0)) as [Всего]
from @nomenclature n
left join
	(Select nomenclature_id, null as orders_qty, storage_qty From @storage
      union all
	 Select nomenclature_id, orders_qty, null as storage_qty From @orders) os on os.nomenclature_id = n.nomenclature_id
Group by n.nomenclature_marka
...
Рейтинг: 0 / 0
Группировка
    #39665036
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gigarЕсли продублировать последнюю строку в заказах, то вместо вычитания (склад-заказы) происходит ,почему-то,суммированиеА, да, ошибка.

Нужно сгруппировать по nomenclature_id

Как это сделал Kopelly, или так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select	n.nomenclature_marka, 
		sum(case when n.nomenclature_type = 'салон' then s.storage_qty else 0 end) - sum(case when n.nomenclature_type = 'салон' then o.orders_qty else 0 end) as [всего салон],
		sum(case when n.nomenclature_type = 'багажник' then s.storage_qty else 0 end) - sum(case when n.nomenclature_type = 'багажник' then o.orders_qty else 0 end) as [всего багажник],
		sum(s.storage_qty) - sum(o.orders_qty) as [Всего]
from @nomenclature n
	left join (select nomenclature_id, sum(orders_qty) as orders_qty from @orders o group by nomenclature_id) as o
		on o.nomenclature_id = n.nomenclature_id
	left join (select nomenclature_id, sum(storage_qty) as storage_qty from @storage s group by nomenclature_id) as s
		on s.nomenclature_id = n.nomenclature_id
group by n.nomenclature_marka
...
Рейтинг: 0 / 0
Группировка
    #39665077
gigar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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