Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка / 8 сообщений из 8, страница 1 из 1
24.06.2018, 20:15
    #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
24.06.2018, 21:01
    #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
24.06.2018, 23:21
    #39664944
gigar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Проблема в том, что в таблице склад(storage) имеются записи(nomenclature_id), которых нет в заказах (orders).
А в заказах nomenclature_id может быть несколько раз одинаковые.
...
Рейтинг: 0 / 0
24.06.2018, 23:33
    #39664947
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
gigarПроблема в том, что в таблице склад(storage) имеются записи(nomenclature_id), которых нет в заказах (orders).
А в заказах nomenclature_id может быть несколько раз одинаковые.Эээ, разве у меня это не учитывается?

Вы поправьте тогда ваши тестовые данные для описанных вами случаев, посмотрим, поправим, если что не так.
...
Рейтинг: 0 / 0
25.06.2018, 00:03
    #39664950
gigar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Если продублировать последнюю строку в заказах, то вместо вычитания (склад-заказы) происходит ,почему-то,суммирование
...
Рейтинг: 0 / 0
25.06.2018, 08:06
    #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
25.06.2018, 08:51
    #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
25.06.2018, 09:41
    #39665077
gigar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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