Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите упростить (переделать под Compact Edition)  [new]
.CE.
Guest
имеется таблица фактур за месяц вида: день, число фактур
(dt datetime, num integer)

надо отобразить эти фактуры на календаре за месяц.
вот работающий пример.
сказали, что сервер 2008, я написала вот такое:
set language russian

;with cte as 
(select GETDATE() as dt, 6 as num union all
 select '20120601', 1 union all
 select '20120603', 3)


,cte1 as (
select 
	dateadd(day, r, DATEADD(month, DATEDIFF(month, '20010101', t.dt), '20010101')) d,
	DATEPART(dw, dateadd(day, r, DATEADD(month, DATEDIFF(month, '20010101', t.dt), '20010101'))) dw,
	DATEPART(ISO_WEEK, dateadd(day, r, DATEADD(month, DATEDIFF(month, '20010101', t.dt), '20010101'))) r
from (cte t cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
              (11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
              (21),(22),(23),(24),(25),(26),(27),(28),(29),(30))num(r))              
where month(dateadd(day, r, DATEADD(month, DATEDIFF(month, '20010101', t.dt), '20010101'))) = MONTH(t.dt))

,cte2 as (
select t1.dw, t1.r, isnull(t.num, 0) num
from cte1 t1 left join cte t on cast(t.dt as date) = t1.d )   

select r,
      [1], [2], [3], [4], [5], [6], [7]
from cte2 pivot (max(num) for dw in ([1], [2], [3], [4], [5], [6], [7]))p
order by r


теперь жалуются, что выдается куча ошибок,
потому что у них Compact Edition.
версию не знают, а я вообще ничего не занаю про CE,
и есть ли там @@version.

можно наверное избавиться от values,
раскрыть CTE и переписать pivot через case.
но если у них нет ISO_WEEK, я не знаю, чем его заменить.
недели нужны именно такие, как мы в календаре видим, т.е. WEEK не подходит.
и надо еще, чтоб первый день понедельник был,
а я не в курсе, канает ли там смена языка для сессии,
похоже что нет, попросила выполнить set language english,
чтоб ошибки на английском прочитать, не сменилось ничего.
помогите пожалуйста
6 июн 12, 11:05    [12672841]     Ответить | Цитировать Сообщить модератору
 Re: помогите упростить (переделать под Compact Edition)  [new]
.CE.
Guest
за отсутствием других идей так и переписала,
убрав values, раскрыв CTE, заменив ISO_WEEK на
+
y * 10000 + m * 100 + 
       datediff(day,0, dt)/7-datediff(day,0, dateadd(month, datediff(month,0, dt),0))/7+1  as w,
		case
			when datepart(dw, dt) + 7 - 1 > 7 then datepart(dw, dt) + 7 - 1 - 7
			else datepart(dw, dt) + 7 - 1
		end as dw


язык сессии сменить так и ме смогла,
поэтому просто этот вариант пересчитывет дни из американской системы отсчета в нашу

+
select w,
       max(case dw when 1 then num end) as [1],
       max(case dw when 2 then num end) as [2],
       max(case dw when 3 then num end) as [3],
       max(case dw when 4 then num end) as [4],
       max(case dw when 5 then num end) as [5],
       max(case dw when 6 then num end) as [6],
       max(case dw when 7 then num end) as [7]
from
(
select t5.dt, t5.w, t5.dw, 
       coalesce(f.num, 0) as num
from
(
select dt, w, dw
from
(
select dt,
       y * 10000 + m * 100 + 
       datediff(day,0, dt)/7-datediff(day,0, dateadd(month, datediff(month,0, dt),0))/7+1  as w,
		case
			when datepart(dw, dt) + 7 - 1 > 7 then datepart(dw, dt) + 7 - 1 - 7
			else datepart(dw, dt) + 7 - 1
		end as dw    
from
(
select y, m,
       dateadd(day, k, dt) dt
from 
(select distinct
        datepart(month, dt) as m,
		datepart(year, dt) as y,
        cast(datepart(year, dt) * 10000 + datepart(month, dt) * 100 + 1 as nchar(8)) as dt
from f) t1

cross join 

(select 0 as k union all
select 1 as k union all select 2 as k union all select 3 as k union all select 4 as k union all select 5 as k union all select 6 as k union all
select 7 as k union all select 8 as k union all select 9 as k union all select 10 as k union all select 11 as k union all select 12 as k union all
select 13 as k union all select 14 as k union all select 15 as k union all select 16 as k union all select 17 as k union all select 18 as k union all
select 19 as k union all select 20 as k union all select 21 as k union all select 22 as k union all select 23 as k union all select 24 as k union all
select 25 as k union all select 26 as k union all select 27 as k union all select 28 as k union all select 29 as k union all select 30 as k)t2

where datepart(month,dateadd(day, k, dt)) = m
)t3
)t4
)t5 left join f on convert(nchar(8), t5.dt, 112) = convert(nchar(8), f.dt, 112)
)t6
group by w


вот попутно календарь, вдруг кому пригодится.
т.е. для таблицы f(dt datetime)
рисует календарь встречающихся в таблице месяцев
+
select w,
       max(case dw when 1 then dt end) as [1],
       max(case dw when 2 then dt end) as [2],
       max(case dw when 3 then dt end) as [3],
       max(case dw when 4 then dt end) as [4],
       max(case dw when 5 then dt end) as [5],
       max(case dw when 6 then dt end) as [6],
       max(case dw when 7 then dt end) as [7]
from
(
select dt,
       y * 10000 + m * 100 + 
        datediff(day,0, dt)/7-datediff(day,0, dateadd(month, datediff(month,0, dt),0))/7+1  as w,
   		case
			when datepart(dw, dt) + 7 - 1 > 7 then datepart(dw, dt) + 7 - 1 - 7
			else datepart(dw, dt) + 7 - 1
		end  as dw    
from
(
select y, m,
       dateadd(day, k, dt) dt
from 
(select distinct
        datepart(month, dt) as m,
		datepart(year, dt) as y,
        cast(datepart(year, dt) * 10000 + datepart(month, dt) * 100 + 1 as nchar(8)) as dt
from f) t1

cross join 

(select 0 as k union all
select 1 as k union all select 2 as k union all select 3 as k union all select 4 as k union all select 5 as k union all select 6 as k union all
select 7 as k union all select 8 as k union all select 9 as k union all select 10 as k union all select 11 as k union all select 12 as k union all
select 13 as k union all select 14 as k union all select 15 as k union all select 16 as k union all select 17 as k union all select 18 as k union all
select 19 as k union all select 20 as k union all select 21 as k union all select 22 as k union all select 23 as k union all select 24 as k union all
select 25 as k union all select 26 as k union all select 27 as k union all select 28 as k union all select 29 as k union all select 30 as k)t2

where datepart(month,dateadd(day, k, dt)) = m
)t3
)t4
group by w



если кто подскажет, как сменить язык сессии, буду очень признательна.
почему-то даже в гугле нет.
6 июн 12, 17:23    [12676796]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить