Присоединиться к CTE (с количеством рабочих дней) с запросом - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица CTE без. вычисленных рабочих дней, и отдельный запрос, в котором я хотел бы, чтобы эта таблица CTE была присоединена и считана в wkdaysinmonth, wkdaystodate, но я вроде как потерял, как соединить эти два вместе и получить результаты:

 with dates as(
        select dateadd(d,-day(getdate())+1,convert(date,getdate())) as startofmonth,
        dateadd(d,-1,dateadd(m,1,dateadd(d,-day(getdate())+1,convert(date,getdate())))) as endofmonth,
        convert(date,getdate()) as today
    ), holidays as (
        select *
        from (values ('20181224'),('20181225'),('20181231')) x (holiday)
     )
    ,holidaycount as (
        select count(*) as holidaysinmonth,
            sum(case when holiday<=today then 1 else 0 end) as holidaystodate
        from dates
        join holidays on holiday between startofmonth and endofmonth
    )
    ,daycounts as(
        select dates.*,

           (DATEDIFF(dd, startofmonth, endofmonth) + 1)
          -(DATEDIFF(wk, startofmonth, endofmonth) * 2)
          -(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END) 
          -(CASE WHEN DATENAME(dw, endofmonth) = 'Saturday' THEN 1 ELSE 0 END)
          -isnull(holidaysinmonth,0) as wkdaysinmonth,

           (DATEDIFF(dd, startofmonth, today) + 1)
          -(DATEDIFF(wk, startofmonth, today) * 2)
          -(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END) 
          -(CASE WHEN DATENAME(dw, today) = 'Saturday' THEN 1 ELSE 0 END)
          -isnull(holidaystodate,0) as wkdaystodate

        from dates
        cross join holidaycount
    )

------------- код 2 -------------

Я пробовал что-то подобное, но это не работает:

with dates as(
    select dateadd(d,-day(getdate())+1,convert(date,getdate())) as startofmonth,
    dateadd(d,-1,dateadd(m,1,dateadd(d,-day(getdate())+1,convert(date,getdate())))) as endofmonth,
    convert(date,getdate()) as today
), holidays as (
    select *
    from (values ('20181224'),('20181225'),('20181231')) x (holiday)
 )
,holidaycount as (
    select count(*) as holidaysinmonth,
        sum(case when holiday<=today then 1 else 0 end) as holidaystodate
    from dates
    join holidays on holiday between startofmonth and endofmonth
)
,daycounts as(
    select dates.*,

       (DATEDIFF(dd, startofmonth, endofmonth) + 1)
      -(DATEDIFF(wk, startofmonth, endofmonth) * 2)
      -(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, endofmonth) = 'Saturday' THEN 1 ELSE 0 END)
      -isnull(holidaysinmonth,0) as wkdaysinmonth,

       (DATEDIFF(dd, startofmonth, today) + 1)
      -(DATEDIFF(wk, startofmonth, today) * 2)
      -(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, today) = 'Saturday' THEN 1 ELSE 0 END)
      -isnull(holidaystodate,0) as wkdaystodate

    from dates
    cross join holidaycount
)

Ошибка: неправильный синтаксис рядом с ключевым словом «вкл.»

Необходимые выходные столбцы:

inv_date,SALES_ID,CL_KEY,weekdaysinmonth

Любая помощь приветствуется .. Thankyou

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Причина вашей ошибки в том, что вы пытаетесь сослаться на «внутреннюю» таблицу во «внешнем» запросе. Вы можете сделать только наоборот. У вас также есть ON без JOIN.

Короче, то, что у вас есть:

SELECT ... FROM (Derived Table) o1 ON o1.Column=c.Column

Мало того, что нет JOIN для этого предложения ON, но псевдоним c не существует во внешнем запросе.

Вам нужно сделать все, чтобы связать c с другими таблицами внутри самой производной таблицы, а не с внешним запросом.

0 голосов
/ 09 января 2019

В сообщении об ошибке написано

Неверный синтаксис рядом с ключевым словом 'on'

потому что ваше объединение ссылается на псевдоним таблицы, объявленный в таблице создания скобок o1

Я рекомендую вам создать календарную таблицу , а не динамически генерировать даты. Вы можете иметь поля для выходных, wkdaysinmonth и wkdaystodate могут быть предварительно рассчитаны, и у вас есть только одна таблица для присоединения.


Примечание о вашем стиле кода; Вы должны придерживаться одного стиля заглавных букв в вашем коде, это делает запрос намного легче для чтения. Иногда вы используете ALL_CAPS, иногда all_lower взаимозаменяемо для имен таблиц и полей.

Общий стиль, который я вижу для SQL Server:

Capitalised_Table_Names.all_lower_field_names

Даже если вам не нравится этот стиль, определите свой собственный стиль, но будьте последовательны.

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