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

Откуда:
Сообщений: 1197
Привет.

Есть такие таблицы:

1. магазины (есть также информация на родителя - ритейлера)
2. даты с неделями
3. Продажи магазинов
4. группы товаров

нужно вывести кол-во продаж понедельно, сгруппированные по ритейлеру на определенную группы товаров.
Надо выводить следующее если на входе есть

РитейлерА - ГруппаА - Неделя 1 - Кол-во
РитейлерА - ГруппаА - Неделя 2 - Кол-во
РитейлерА - ГруппаА - Неделя 3 - Кол-во

проблема в запросе. указал даже место.
Суть не работает обрезка по моделям

вот накидал в пример

set dateformat 'dmy'

--1. магазины
declare  @stores table(retailerId int,
					 storeId int)
insert @stores 
values (1, 1), (1, 2)
			
--2. даты с неделями		 
declare  @weekDates table(saledate date,
						 weekNumber nchar(6))
insert @weekDates 
values ('01/01/2013', '201301'),  
	   ('02/01/2013', '201301'),  
	   ('03/01/2013', '201301'),
	   ('04/01/2013', '201301'),  
	   ('05/01/2013', '201301'),  
	   ('06/01/2013', '201301'),
	   ('07/01/2013', '201301'),
	   
	   ('08/01/2013', '201302'),  
	   ('09/01/2013', '201302'),  
	   ('10/01/2013', '201302'),
	   ('11/01/2013', '201302'),  
	   ('12/01/2013', '201302'),  
	   ('13/01/2013', '201302'),
	   ('14/01/2013', '201302')
		
--3. Продажи магазинов			 
declare  @storeSales table(articul nvarchar(10),
						   groupName nvarchar(10),
						  saledate date,
						  storeId int)
insert @storeSales
values ('A123', 'Gift', '02/01/2013', 1), 
	   ('B124', 'Auto', '06/01/2013', 2)
						  
--4. группы товаров
declare @productGroups table (groupName nvarchar(10))	
insert @productGroups
values ('Gift'), ('Tickets')					 
	   
select s.retailerid, wd.weeknumber, ss.groupName, count(articul) as SalesCnt
from @stores s 
 cross join @weekDates wd
 left join @storeSales ss
  on s.storeid = ss.storeid and wd.saledate = ss.saledate  
 /*join @productGroups pg                     --!!! ТУТ
  on ss.groupName = pg.groupName*/
group by  s.retailerid, wd.weeknumber, ss.groupName

	   
9 янв 13, 16:58    [13742768]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
pio777
Member

Откуда:
Сообщений: 127
relief,

Получается у вас в магазине продают товары, которых нет таблице с группами товаров. Какая связь между таблицей @productGroups и @storeSales?
9 янв 13, 17:53    [13743150]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
relief
Member

Откуда:
Сообщений: 1197
pio777
relief,

Получается у вас в магазине продают товары, которых нет таблице с группами товаров. Какая связь между таблицей @productGroups и @storeSales?


сорри.
строку где идет вставка в @storeSales
('B124', 'Auto', '06/01/2013', 2)

надо удалить
9 янв 13, 18:12    [13743256]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
relief,
а так?
+
set dateformat 'dmy'

--1. магазины
declare  @stores table(retailerId int,
					 storeId int)
insert @stores 
values (1, 1), (1, 2)
			
--2. даты с неделями		 
declare  @weekDates table(saledate date,
						 weekNumber nchar(6))
insert @weekDates 
values ('01/01/2013', '201301'),  
	   ('02/01/2013', '201301'),  
	   ('03/01/2013', '201301'),
	   ('04/01/2013', '201301'),  
	   ('05/01/2013', '201301'),  
	   ('06/01/2013', '201301'),
	   ('07/01/2013', '201301'),
	   
	   ('08/01/2013', '201302'),  
	   ('09/01/2013', '201302'),  
	   ('10/01/2013', '201302'),
	   ('11/01/2013', '201302'),  
	   ('12/01/2013', '201302'),  
	   ('13/01/2013', '201302'),
	   ('14/01/2013', '201302')
		
--3. Продажи магазинов			 
declare  @storeSales table(articul nvarchar(10),
						   groupName nvarchar(10),
						  saledate date,
						  storeId int)
insert @storeSales
values ('A123', 'Gift', '02/01/2013', 1)
						  
--4. группы товаров
declare @productGroups table (groupName nvarchar(10))	
insert @productGroups
values ('Gift'), ('Tickets')					 
	   
select s.retailerid, wd.weeknumber, ss.groupName, count(articul) as SalesCnt
from @stores s   
  join @storeSales ss
  on s.storeid = ss.storeid 
  join @weekDates wd
    on ss.saledate =wd.saledate
 
group by  s.retailerid, wd.weeknumber, ss.groupName
10 янв 13, 00:42    [13744420]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
relief
Member

Откуда:
Сообщений: 1197
ZVER-10,

не показывается кол-во продаж по второй неделе.
А надо показывать по всем неделям
10 янв 13, 09:07    [13744871]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
pio777
Member

Откуда:
Сообщений: 127
relief,
Возможно, так?
+
set dateformat 'dmy'

--1. магазины
declare  @stores table(retailerId int,
					 storeId int)
insert @stores 
values (1, 1), (1, 2)
			
--2. даты с неделями		 
declare  @weekDates table(saledate date,
						 weekNumber nchar(6))
insert @weekDates 
values ('01/01/2013', '201301'),  
	 ('02/01/2013', '201301'),  
	 ('03/01/2013', '201301'),
	 ('04/01/2013', '201301'),  
	 ('05/01/2013', '201301'),  
	 ('06/01/2013', '201301'),
	 ('07/01/2013', '201301'),
	   
	 ('08/01/2013', '201302'),  
	 ('09/01/2013', '201302'),  
	 ('10/01/2013', '201302'),
	 ('11/01/2013', '201302'),  
	 ('12/01/2013', '201302'),  
	 ('13/01/2013', '201302'),
	 ('14/01/2013', '201302')
		
--3. Продажи магазинов			 
declare  @storeSales table(articul nvarchar(10),
						   groupName nvarchar(10),
						  saledate date,
						  storeId int)
insert @storeSales
values ('A123', 'Gift', '02/01/2013', 1), 
	 ('B124', 'Auto', '06/01/2013', 2),
	 ('B125', 'Auto', '09/01/2013', 2),
	 ('B126', 'Auto', '14/01/2013', 2)
						  
--4. группы товаров
declare @productGroups table (groupName nvarchar(10))	
insert @productGroups
values ('Gift'), ('Auto')					 
	   

select s.retailerid, wd.weeknumber, pg.groupName, count(articul) as SalesCnt 
from @stores s 
 cross join @weekDates wd
 cross join @productGroups pg
 left join @storeSales ss
 on s.storeid = ss.storeid and wd.saledate = ss.saledate and pg.groupName=ss.groupName
 group by  s.retailerid, wd.weeknumber, pg.groupName
10 янв 13, 11:01    [13745525]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
select wd.retailerid, wd.weeknumber, wd.groupName, count(x.articul) as SalesCnt
from
	(select * from @weekDates wd cross join @productGroups pg cross join @stores s) wd
left join (select s.retailerid, ss.storeId, ss.groupName, ss.articul, ss.saledate from @stores s inner join @storeSales ss on ss.storeId = s.storeId ) x on x.saledate = wd.saledate and x.groupName = wd.groupName and x.storeId = wd.storeId
group by
	wd.retailerid, wd.weeknumber, wd.groupName
10 янв 13, 14:18    [13747077]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
Select s.retailerId, wd.weekNumber, sa.groupName, COUNT(*) as SalesCnt
from @storeSales sa 
left outer join @stores s on sa.storeId = s.storeId
left outer join @weekDates wd on sa.saledate = wd.saledate
group by s.retailerId, wd.weekNumber, sa.groupName
10 янв 13, 17:08    [13748667]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
пардон, не тот кусок отправил. Вот что хотел:
Select s.retailerId, wd.weekNumber,  pg.groupName, COUNT(*) as SalesCnt
from @storeSales ss
left outer join @stores s on ss.storeId = s.storeId
left outer join @weekDates wd on ss.saledate = wd.saledate
 left outer join @productGroups pg  on ss.groupName = pg.groupName
group by s.retailerId, wd.weekNumber, pg.groupName
10 янв 13, 17:09    [13748682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить