Отображение недель в виде столбцов - PullRequest
0 голосов
/ 02 января 2012

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

SET DATEFIRST 1    
SELECT ta.account, ta.customer, SUM(amount), DATEPART(ww,ta.dt) WeekNumber
FROM tablename ta
WHERE dt >= '12/01/2011 00:00:00' 
      and dt < '12/29/2011 00:00:00'
GROUP BY ta.account, ta.customer, DATEPART(ww,ta.dt)

Как отобразить в качестве различий недели в столбцах различий в моем результате.Любое предложение будет полезно.

Пример O / P для вышеупомянутого:

Date    Account         Customer    TotalSeconds    Amount  WeekNumber

2011-11-01  xx0918252   198303792R  394         2.99    45
2011-11-08  xx1006979   200100567G  92          0.16    46
2011-11-15  xx1005385   A6863744I   492         1.275   47
2011-11-21  xx1012872   D7874694G   770         0.52    48
2011-11-28  xx1006419   C7112151H   1904        2.64    49
2011-11-28  xx1006420   G7378945A   77          0.3     49

Я хочу, чтобы O / P было похоже:

Date     Account    Customer    TotalSeconds    Amount  WeekNumber45   WeekNumber46   WeekNumber47   WeekNumber8   WeekNumber49

и соответствующие им данные.Надеюсь, ты понимаешь мой вопрос.Заранее спасибо.

Привет всем, Спасибо за предложения и помощь.Наконец, я получил результаты, которые я хотел на время.Я до сих пор считаю, что это сложно кодировать.Есть ли лучшее решение для этого.Заранее спасибо.Мой код выглядит следующим образом:

SELECT  ta.account, ta.customer, 
isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '49' THEN amount END),0) AS "Week49",

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '50' THEN amount END),0) AS "Week50",

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '51' THEN amount END),0) AS "Week51",

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '52' THEN amount END),0) AS "Week52",

isnull(SUM(CASE WHEN DATEPART(ww,ta.dt) = '53' THEN amount END),0) AS "Week53",

FROM (
select * from tablename
where dt >= '12/01/2011 00:00:00' and dt <= '12/31/2011 00:00:00'
) ta
group by ta.account, ta.customer

Ответы [ 3 ]

1 голос
/ 03 января 2012

Прежде всего, я бы поместил ваш результат во временную таблицу для дальнейших расчетов. Давайте представим, что следующий CTE - ваш результат:

if object_id('tempdb..#tab') is not null drop table #tab

;with cte (Date,Account,Customer,TotalSeconds,Amount,WeekNumber) as (
    select cast('20111101' as datetime),'xx0918252','198303792R',394,2.99,45 union all
    select '20111108','xx1006979','200100567G',92,0.16,46 union all
    select '20111115','xx1005385','A6863744I',492,1.275,47 union all
    select '20111121','xx1012872','D7874694G',770,0.52,48 union all
    select '20111128','xx1006419','C7112151H',1904,2.64,49 union all
    select '20111128','xx1006420','G7378945A',77,0.3,49
)
select * into #tab from cte

Теперь ваши вычисленные данные находятся в таблице #tab, и следующий запрос возвращает сводную таблицу для этих weeknumber s:

select date, account, customer, totalSeconds, amount, [45], [46], [47], [48], [49] from
(
    select date, account, customer, totalSeconds, amount, weeknumber as weeknumber from #tab
) src
pivot
(
    max(weeknumber) for weekNumber in ([45], [46], [47], [48], [49])
) pvt

Динамическая версия этого запроса может выглядеть следующим образом:

declare @sql nvarchar(max), @cols varchar(max)

select @cols = coalesce(@cols + ',', '') + '[' + cast(weeknumber as varchar) + ']' 
from (select distinct weeknumber from #tab) t
order by weeknumber

set @sql = N'
    select date, account, customer, totalSeconds, amount, ' + @cols + ' from
    (
        select date, account, customer, totalSeconds, amount, weeknumber as weeknumber from #tab
    ) src
    pivot
    (
        max(weeknumber) for weekNumber in (' + @cols + ')
    ) pvt
'

exec sp_executesql @sql

Результат (в обоих случаях):

date                    account   customer   totalSeconds amount     45     46     47     48     49
----------------------- --------- ---------- ------------ ---------- ------ ------ ------ ------ ------
2011-11-01 00:00:00.000 xx0918252 198303792R 394          2.990      45     NULL   NULL   NULL   NULL
2011-11-08 00:00:00.000 xx1006979 200100567G 92           0.160      NULL   46     NULL   NULL   NULL
2011-11-15 00:00:00.000 xx1005385 A6863744I  492          1.275      NULL   NULL   47     NULL   NULL
2011-11-21 00:00:00.000 xx1012872 D7874694G  770          0.520      NULL   NULL   NULL   48     NULL
2011-11-28 00:00:00.000 xx1006419 C7112151H  1904         2.640      NULL   NULL   NULL   NULL   49
2011-11-28 00:00:00.000 xx1006420 G7378945A  77           0.300      NULL   NULL   NULL   NULL   49
0 голосов
/ 02 января 2012
0 голосов
/ 02 января 2012

Посмотрите на функцию PIVOT.

Команда поворота Tsql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...