powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять CTE
13 сообщений из 38, страница 2 из 2
Помогите понять CTE
    #38328141
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007, Pivot, это классно. Но ведь я получу только за один месяц. Как мне применить это к остальным месяцам?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328142
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DATENAME - недетерминированная функция.
Поэтому иногда её применить не получится.

Лучше считать остаток от деления на 7 периода времени с 01.01.1900, выраженного в днях!
1 января 1900 был понедельником. Поэтому остаток, равный 0, означает "понедельник".
Число 0 без проблем конвертируется именно в '1900'.
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328167
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во у меня какой календарь есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
DECLARE @FromMonth CHAR(6),@ToMonth CHAR(6);
SELECT @FromMonth='200101',@ToMonth='201401';
DECLARE @Language NVARCHAR(4000);
SET @Language=@@LANGUAGE;
IF @@LANGUAGE<>N'русский' SET LANGUAGE Russian;
WITH
 Dates(D)AS(SELECT CAST(@FromMonth+'01' AS DATETIME) UNION ALL SELECT DATEADD(DAY,1,D) FROM Dates WHERE D<DATEADD(DAY,-1,@ToMonth+'01'))
,WeekDays(Y,M,D,WD,N,WNo)AS(SELECT YEAR(D), MONTH(D), STR(DAY(D),2),(@@DATEFIRST+DATEPART(WEEKDAY,D))%7, DATENAME(MONTH,D),(DAY(D)-1+(@@DATEFIRST+DATEPART(WEEKDAY, CONVERT(CHAR(6),D,112)+'01')-2)%7)/7 FROM Dates)
,Calendar AS
(
 SELECT Y,M,WNo
, CASE WHEN WNo=0 AND M=1 THEN STR(Y,4) ELSE''END[Год]
, LEFT(CASE WNo WHEN 0 THEN CASE M WHEN 1 THEN REPLICATE('=',8)ELSE REPLICATE('-',8)END WHEN 2 THEN N ELSE''END,8)[Месяц]
, ISNULL([2],'')[Пн]
, ISNULL([3],'')[Вт]
, ISNULL([4],'')[Ср]
, ISNULL([5],'')[Чт]
, ISNULL([6],'')[Пт]
, ISNULL('['+[0]+']','')[Сб]
, ISNULL('['+[1]+']','')[Вс]
 FROM WeekDays PIVOT (MAX(D) FOR WD IN([0],[1],[2],[3],[4],[5],[6])) Pvt
)
SELECT [Год],[Месяц],[Пн],[Вт],[Ср],[Чт],[Пт],[Сб],[Вс] FROM Calendar ORDER BY Y,M,WNo OPTION(MAXRECURSION 0);
IF @@LANGUAGE<>@Language SET LANGUAGE @Language;

http://www.sql.ru/forum/519478/kalendar-nyneshnego-mesyaca

Сейчас бы по-другому сделал...
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328172
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobonick,
задачу-то сформулируйте хотя бы... полностью, а не с регулярными вводными :)
в старттопике была генерация дней от начала текущего месяца до конца света,
потом вопрос о количестве дней недели в текущем месяце,
теперь выясняется, что месяцев несколько...
что будет дальше?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328184
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДЫ, просто задумка была как раз посчитать количество дней через CTE в месяце и сгруппировать их по дням недели, а потом pivot применить, но ведь у меня же еще месяц в зависимости от даты выбирается. А дат много. И нужно это все в таблицу вывести
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328191
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobonick,

Вам ещё не посоветовали сделать постоянную таблицу с датами лет на сто?
И таблицу с числами хотя бы от 0 до миллиона?

Сделайте. Не пожалеете. Все подобные задачи станут элементарными.
И сервер их обработает максимально эффективно.
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328259
Чтобы понять рекурсию,
нужно понять рекурсию :)
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328291
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
а разве это не одна и та же таблица??
с учетом dateadd(d,number,<базовая дата>) persisted ?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38328300
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007iap,
а разве это не одна и та же таблица??
с учетом dateadd(d,number,<базовая дата>) persisted ?Можно и одну.
У меня вот обе есть. Проиндексированные. Чего тут экономить-то?
К тому же в таблице с датами можно полезную информацию держать (праздник/не праздник, например)
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38344200
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, набросал,но теперь вопрос, как мне это все связать с несколькими месяцами? Т.е., я передаю,соединяю несколько месяцев, а мне в ответ месяц и сумму всех дней недели этих месяцев

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH CTE AS
(
	SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[SUNDAY DATE]
	UNION ALL
	SELECT DATEADD(D,1,[SUNDAY DATE]) FROM CTE 
WHERE [SUNDAY DATE]<=DATEADD(D,-DATEPART(D,GETDATE()),DATEADD(M,1,GETDATE()))-1
)
SELECT Convert(varchar(7),[SUNDAY DATE],120)odate,
SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Monday' THEN 1 ELSE 0 END) Mon
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Tuesday' THEN 1 ELSE 0 END) Tue
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Wednesday' THEN 1 ELSE 0 END) Wed
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Thursday' THEN 1 ELSE 0 END) Thu
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Friday' THEN 1 ELSE 0 END) Fri
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Saturday' THEN 1 ELSE 0 END) Sat
, SUM(CASE datename(weekday,[SUNDAY DATE]) WHEN 'Sunday' THEN 1 ELSE 0 END) Sun

FROM CTE
group by Convert(varchar(7),[SUNDAY DATE],120)
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38344203
boobonick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. примерно так должно быть:
Код: sql
1.
2.
3.
odate	Mon	Tue	Wed	Thu	Fri	Sat	Sun
2013-07	5	5	5	4	4	4	4
2013-05   4      5      4      5      4      4      4
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38344632
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в CTE генерируются все даты за один месяц - откуда второй строке взяться?
...
Рейтинг: 0 / 0
Помогите понять CTE
    #38344709
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare @date_from datetime='20130620', @date_to datetime='20130810'
set datefirst 1 -- неделя начинается с понедельника
select * 
from (
   select YM YEAR_MONTH, WD WEEKDAY, COUNT(*) qty
   from master..spt_values v 
   cross apply (select DAY=DATEADD(DAY, v.number, @date_from)) DAY
   cross apply (select 
      YM=LEFT(CONVERT(varchar,DAY,120),7),
      WD=DATEPART(WEEKDAY,DAY)
      ) YM
   where v.type='P' and v.number<=DATEDIFF(DAY, @date_from,@date_to)
   group by YM,WD
   )g
pivot(max(qty)for weekday in ([1],[2],[3],[4],[5],[6],[7]))p
order by YEAR_MONTH

YEAR_MONTH12345672013-0611122222013-0755544442013-081112221
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять CTE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]