Сводка в значениях с датами? - PullRequest
0 голосов
/ 14 июля 2011

В конце моего sql, я использую следующий код. Есть ли способ заменить фиксированные строки [2011/07/14], [2011/07/16] и т. Д. Значением GetDate ()?

PIVOT 
    (
       count([AppointmentsBooked])
       FOR [date] IN ([2011/07/14], [2011/07/16], [2011/07/17],[2011/07/18],[2011/07/21])
    ) as pivottable

Ответы [ 3 ]

0 голосов
/ 28 июля 2011

Вы можете создать строку со всеми датами, разделенными запятыми с помощью '[' и ']' до и после каждой даты.присвойте эту строку строковой переменной (@dates) и используйте метод строкового сплита, чтобы разбить все даты внутри сводного запроса.

0 голосов
/ 13 июля 2012

этот вопрос был опубликован около года назад. мне все равно. у меня есть какой-то код, который может быть именно тем, что хотел ОП ... я уверен, что он никогда не вернется и не выберет ответ, но все же .... все, что я хочу сделать, это подсчитать записи по месяцам с помощью сводки для нескольких таблиц и в конечном итоге сравнить количество записей для каждого месяца для каждой таблицы. однако ... в этом коде есть только одна таблица (rt_taco_15m), но это не имеет значения. я просто не написал остальное, чтобы полностью соответствовать моим потребностям. но я думаю, что это соответствует потребностям ОП или, по крайней мере, дает ему хорошее начало ... если он действительно год ждал этой проблемы. лол.

if object_id('tempdb..#temp') is not null drop table #temp
if object_id('tempdb..#temp2') is not null drop table #temp2
if object_id('tempdb..#temp3') is not null drop table #temp3

declare @start_date as datetime
    set @start_date = cast('1-1-2012' as datetime)
declare @end_date as datetime
    set @end_date = cast('9-1-2012' as datetime)


;with cte as    (
    select  @start_date as [start], 
            dateadd(month, 1, @start_date) as [end]

    union   all

    select  dateadd(month, 1, [start]) as [start], 
            dateadd(month, 1, dateadd(month, 1, [start])) as [end]
    from    cte
    where   dateadd(month, 1, [start]) <= @end_date
)


(select 'rt_taco_15m' as table_name, 
        convert(varchar(10), [start], 101) as [start],  
        convert(varchar(10), [end], 101) as [end],
        datename(month, [start]) as month_name, 
        cast([start] as integer) as orderby,
        count(taco.taco_record_id) as [range_count] 

into    #temp 

from    cte

        left outer join rt_taco_15m as taco
            on taco.period >= cte.[start] and 
                taco.period < cte.[end]  

group   by cte.[start], cte.[end])


select  table_name as table_name, 
        convert(varchar(10), getdate(), 101)  as [start], 
        convert(varchar(10), getdate(), 101) as [end],
        'Total' as month_name, 
        cast(dateadd(month,2,@end_date) as integer) as orderby,
        range_sum as [range_count]

into    #temp2

from    (select table_name, sum([range_count]) as range_sum
            from #temp group by table_name) as summed_up

select  * 
into    #temp3
from    (select * from #temp
         union all
         select * from #temp2) as x
order by orderby


select * from #temp3

declare @cols nvarchar(2000)
select  @cols = stuff(
                    (select '],[' + month_name
                     from    #temp3 
                     order by orderby
                     for xml path('') ) 
                , 1, 2, '') + ']'
print @cols


if object_id('tempdb..#temp2') is not null drop table #temp2
declare @query varchar(max)
set @query = N'
                select  table_name, ' + @cols + N'

                from    (select table_name, month_name, range_count
                            from #temp3) p 

                        pivot ( sum(range_count) for month_name in ( '+ @cols +' ) ) as pvt'

execute(@query
0 голосов
/ 14 июля 2011

Можете ли вы попробовать использовать BETWEEN и DATEADD следующим образом:

DECLARE @dates TABLE(value DateTime)

INSERT INTO @dates VALUES
(GETDATE()),
('2011/07/9'),
('2011/07/17'), 
('2011/07/18'), 
('2011/07/21')

SELECT value FROM @dates
WHERE value BETWEEN GETDATE() AND DATEADD(day, 5, GETDATE())
...