Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) затруднения в написании запроса с группировкой по периодам (число прочтений - 5722 )
JBoy
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 29. Декабря 2010
затруднения в написании запроса с группировкой по периодам
16. Ноября 2011 :: 08:05
Печать  
сижу туплю над следующей задачей - есть sql таблица со следующими полями - склад, датавремя, и числопосещений. в итоге хотелось бы видеть отчет за произвольный период со следующей детализацией: по вертикали - склад, месяц, по горизонтали - день...вроде все просто, но что то никак не соображу - толкните в нужную сторону
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: затруднения в написании запроса с группировкой по периодам
Ответ #1 - 16. Ноября 2011 :: 08:50
Печать  
Для начала - какая версия SQL сервара, от этого зависит конструкция запроса в частности использование OVER и WITH.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: затруднения в написании запроса с группировкой по периодам
Ответ #2 - 16. Ноября 2011 :: 08:54
Печать  
запрос к табличке с датами + левое соединение с твоей табличкой.
Табличку с датами сформировать в самом скуле, примеры есть тут на форуме.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: затруднения в написании запроса с группировкой по периодам
Ответ #3 - 16. Ноября 2011 :: 08:54
Печать  
pvase писал(а) 16. Ноября 2011 :: 08:50:
Для начала - какая версия SQL сервара, от этого зависит конструкция запроса в частности использование OVER и WITH.


А зачем тут over ?
  
Наверх
 
IP записан
 
JBoy
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 29. Декабря 2010
Re: затруднения в написании запроса с группировкой по периодам
Ответ #4 - 16. Ноября 2011 :: 08:55
Печать  
2000
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: затруднения в написании запроса с группировкой по периодам
Ответ #5 - 16. Ноября 2011 :: 09:18
Печать  
Табличку  с датами слепишь так:
http://www.1cpp.ru/forum/YaBB.pl?num=1296209308/13#13
  
Наверх
 
IP записан
 
JBoy
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 29. Декабря 2010
Re: затруднения в написании запроса с группировкой по периодам
Ответ #6 - 16. Ноября 2011 :: 09:22
Печать  
на самом деле вариантов детализаций намного больше - весь период/месяц, весь период/неделя, весь период/день, весь период/час, месяц/день, неделя/день или день/час....
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: затруднения в написании запроса с группировкой по периодам
Ответ #7 - 16. Ноября 2011 :: 09:28
Печать  
Ну и ? у тебя всегда соединение таблички периодов будет с твоей табличкой - чтоб без пропусков периодов был диапазон.
  
Наверх
 
IP записан
 
JBoy
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 29. Декабря 2010
Re: затруднения в написании запроса с группировкой по периодам
Ответ #8 - 16. Ноября 2011 :: 10:23
Печать  
насколько я понял, должен получиться примерно такой запрос?
           |SELECT
           |      convert(char(255),shops.id) Айди,
           |      TABDAT.Dat ДатаСобытия,
           |      SUM(Выборка.RealIn) КолВходов
           |FROM
           |      server3.Cst.dbo.traffics AS Выборка
           |LEFT JOIN server3.Cst.dbo.sensors AS Датчики ON Выборка.sensorid=Датчики.id
           |LEFT JOIN server3.Cst.dbo.entries AS Датчики ON sensors.entryid=Входы.id
           |LEFT JOIN server3.Cst.dbo.shops AS Магазины ON Входы.shopid=Магазины.id
           |LEFT JOIN (SELECT dateadd(day,(a.number+b.number*256),:НачДата) as Dat
           |                  from server3.master..spt_values a, server3.master..spt_values b
           |                  where a.type='P' and b.type='P'
         |                                          and b.number<=datediff(day,:НачДата,:КонДата)/256
         |                                          and a.number<=(datediff(day,:НачДата,:КонДата)-b.number*256) ) as TABDAT on TABDAT.Dat = Выборка.DateCreated
           |WHERE convert(char(255),shops.id)='9D9AB7E8-41F7-4AA5-8539-09307D1DAF07' or convert(char(255),shops.id)='F595578C-51FE-4A3B-B823-04BBBC3992DF'      
           |GROUP BY
           |            convert(char(255),shops.id),
           |            TABDAT.Dat
           |";
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: затруднения в написании запроса с группировкой по периодам
Ответ #9 - 16. Ноября 2011 :: 10:59
Печать  
Создайте в вашей базе таблицу с датами, один раз ее заполните а потом используйте как надо. Вот пример:
Код
Выбрать все
SET DATEFIRST 1
select
	DISTINCT
	A.date AS Дата,
	DATEPART(dw, A.date) AS ДеньВНедели,
	DAY(A.date) AS ДеньВМесяце,
	DATEPART(dy,A.date) AS ДеньВГоду,
	DATEPART(wk,A.date) AS НеделяВГоду,
	MONTH(A.date) AS МесяцВГоду,
	DATEPART(qq,A.date) AS Квартал,
	YEAR(A.date) AS Год
--INTO tbl_Даты
from (select date = cast((b.number * 0x100) + a.number as datetime)
from master..spt_values a
join master..spt_values b
	on (b.number * 0x100) + a.number <= cast(cast('20501231' as datetime) as integer)
	and (b.number * 0x100) + a.number >= cast(cast('20000101' as datetime) as integer)
where
	a.type = 'p'
	and b.type = 'p'
	and b.number * 0x100 <= cast(cast('20101231' as datetime) as integer)
) as A

order by A.date
 

  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: затруднения в написании запроса с группировкой по периодам
Ответ #10 - 16. Ноября 2011 :: 11:01
Печать  
Второе - сделайте выборку в временную таблицу с нужным интервалом и значениями.
Третье - обрабатывайте временную таблицу как надо, что в колонки а что в строки (в случае с SQL 2000 - колонки через CASE).
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: затруднения в написании запроса с группировкой по периодам
Ответ #11 - 16. Ноября 2011 :: 11:29
Печать  
pvase , скажи, как ты собирался over использовать ? Интересно

ЗЫ: по -поводу таблички с датами, глянь 5 пост, там тоже есть решения (и не одно), мот чего сгодится
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: затруднения в написании запроса с группировкой по периодам
Ответ #12 - 16. Ноября 2011 :: 11:52
Печать  
(11) Еще одно решение:
     |DECLARE @D datetime;
     |SET @D=:НачДата
     |WHILE @D<=:КонДата
     |BEGIN
       |INSERT #Периоды(Период) VALUES(@D)
     |SET @D=DATEADD(DAY,1,@D)
     |END

  
Наверх
 
IP записан
 
JBoy
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 29. Декабря 2010
Re: затруднения в написании запроса с группировкой по периодам
Ответ #13 - 16. Ноября 2011 :: 12:54
Печать  
pvase писал(а) 16. Ноября 2011 :: 10:59:
Создайте в вашей базе таблицу с датами, один раз ее заполните а потом используйте как надо. Вот пример:
Код
Выбрать все
SET DATEFIRST 1
select
	DISTINCT
	A.date AS Дата,
	DATEPART(dw, A.date) AS ДеньВНедели,
	DAY(A.date) AS ДеньВМесяце,
	DATEPART(dy,A.date) AS ДеньВГоду,
	DATEPART(wk,A.date) AS НеделяВГоду,
	MONTH(A.date) AS МесяцВГоду,
	DATEPART(qq,A.date) AS Квартал,
	YEAR(A.date) AS Год
--INTO tbl_Даты
from (select date = cast((b.number * 0x100) + a.number as datetime)
from master..spt_values a
join master..spt_values b
	on (b.number * 0x100) + a.number <= cast(cast('20501231' as datetime) as integer)
	and (b.number * 0x100) + a.number >= cast(cast('20000101' as datetime) as integer)
where
	a.type = 'p'
	and b.type = 'p'
	and b.number * 0x100 <= cast(cast('20101231' as datetime) as integer)
) as A

order by A.date
 


а как сюда еще и время добавить или хотя бы часы?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: затруднения в написании запроса с группировкой по периодам
Ответ #14 - 16. Ноября 2011 :: 13:30
Печать  
Eprst писал(а) 16. Ноября 2011 :: 11:29:
pvase , скажи, как ты собирался over использовать ? Интересно

ЗЫ: по -поводу таблички с датами, глянь 5 пост, там тоже есть решения (и не одно), мот чего сгодится


На счет OVER - ошибся, для задачи автора темы - не надо использовать.

По поводу дат - спасибо, посмотрю.

Насколько я понял, то автору надо даты с временем, тогда, можно просто выбрать с таблицы все значения server3.Cst.dbo.traffics.DateCreated и эту таблицу использовать в качестве исходной для дат. Но в таком случае в таблице не будут все даты, а лишь те, что есть в исходной таблице server3.Cst.dbo.traffics. Возможно автору этого достаточно.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать