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

Откуда:
Сообщений: 257
Добрый день.

Помогите составить запрос, в запросе использую операторы пивот

DECLARE
@sqlQuery varchar(max)

DECLARE
@StartDate datetime ,
@EndDate datetime
select
@StartDate = '2012-02-27 00:00:00',
@EndDate = '2012-03-06 23:59:59'

SET @sqlQuery = 'SELECT [статус],[2012-02-27],[2012-02-28],[2012-02-29],[2012-03-01],[2012-03-02],[2012-03-03],[2012-03-04],[2012-03-05],[2012-03-06]
Подскажите как мне сделать чтобы даты создавалиь автоматом, т.е задаю начало и конец, но никак не могу получить чтобы выводилось все поп порядку


Заранее спасибо.
7 мар 12, 12:26    [12209051]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Я формировал строку запроса циклом с инкрементом дат.
Чувствую, что можно было сделать красивее, но не хотелось заморачиваться.
7 мар 12, 12:31    [12209080]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
DECLARE
 @sqlQuery varchar(max)

DECLARE
 @StartDate datetime , 
@EndDate datetime 
select 
@StartDate = '20120227',
@EndDate = '20120306'

;with cte as
(select @StartDate as dt union all select dt+1 from cte where dt<@EndDate)

select @sqlQuery=(select '['+convert(varchar,dt,105)+'],' as 'data()' from cte order by dt for xml path(''))

set @sqlQuery=left(@sqlQuery,len(@sqlQuery)-1)

select @sqlQuery

(No column name)
[27-02-2012], [28-02-2012], [29-02-2012], [01-03-2012], [02-03-2012], [03-03-2012], [04-03-2012], [05-03-2012], [06-03-2012]
7 мар 12, 12:44    [12209189]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
SQL2008,
может как-то так
if object_id('dbo.GetNums') is not null 
  drop function dbo.GetNums ;
GO
create function dbo.GetNums ( @n as bigint )
returns table
  as
return
  with  L0
          as ( select 1 as c
               union all
               select 1
             ) ,
        L1
          as ( select 1 as c
               from   L0 as A
               cross join L0 as B
             ) ,
        L2
          as ( select 1 as c
               from   L1 as A
               cross join L1 as B
             ) ,
        L3
          as ( select 1 as c
               from   L2 as A
               cross join L2 as B
             ) ,
        L4
          as ( select 1 as c
               from   L3 as A
               cross join L3 as B
             ) ,
        L5
          as ( select 1 as c
               from   L4 as A
               cross join L4 as B
             ) ,
        Nums
          as ( select row_number() over ( order by ( select 0
                                                   ) ) as n
               from   L5
             )
  select top ( @n )
          n
  from    Nums
  order by n ;
go

declare @startdt as date = '20120101'
, @enddt as date = '20121231' ;
with zz
as
(
select dateadd(day, n - 1, @startdt)  as dt
from    dbo.GetNums(datediff(day, @startdt, @enddt) + 1) as Nums 
)
,zz1(dxml) as
(
select '['+cast(dt as varchar(50))+'],' 'text()' from zz
order by dt
for xml path(''),type
)
select dxml.value('(./text())[1]','varchar(max)') from zz1
;
7 мар 12, 12:46    [12209208]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user87
Member

Откуда:
Сообщений: 257
Огромное все спасибо, сейчас буду разбираться.
7 мар 12, 12:52    [12209289]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Раз про PIVOT спрашивают, значит, каждая дата в своей колонке должна быть.
А не строковый список
7 мар 12, 12:52    [12209293]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить