сохранить запрос во временную таблицу в isq - PullRequest
0 голосов
/ 29 июня 2018

У меня есть запрос

WITH cte AS 
(
    SELECT 
        *, 
        DATEPART(WEEKDAY, Dt) AS WeekDay,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) 
                OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
        AVG(SaleCount) OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear, DATEPART(WEEKDAY, Dt), IsPromo) AS AVG_WeekDay
    FROM 
        [Action].[dbo].[promo_data_copy]
)
UPDATE a 
SET SaleCount = cte.AVG_WeekDay
FROM CTE
JOIN [Action].[dbo].[promo_data_copy] a ON a.Dt = cte.dt
                                        AND a.ItemRelation = cte.ItemRelation 
                                        AND a.DocumentNum = cte.DocumentNum 
                                        AND a.DocumentYear = cte.DocumentYear 
                                        AND a.ispromo = cte.ispromo
WHERE CTE.PERCENTILE < CTE.SaleCount
  AND DATEPART(WEEKDAY, CTE.Dt) < 5
  AND CTE.ispromo = 0 ;

Когда я запускаю его, моя таблица promo_data_copy обновляется. Это не правильно.

Подскажите, пожалуйста, как это сделать, чтобы окончательный результат возвращался во временную таблицу, пусть "temp_table"?

Edit:

WITH cte AS 
(
    SELECT 
        *,
        DATEPART(WEEKDAY, Dt) AS WeekDay,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) 
              OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
        AVG(SaleCount) OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear, DATEPART(WEEKDAY, Dt), IsPromo) AS AVG_WeekDay
    FROM 
        [Action].[dbo].[promo_data_copy]
)
SELECT * 
INTO #temp_table 
FROM cte 

SET SaleCount = cte.AVG_WeekDay
FROM CTE
JOIN #temp_table a ON a.Dt = cte.dt
                   AND a.ItemRelation = cte.ItemRelation 
                   AND a.DocumentNum = cte.DocumentNum 
                   AND a.DocumentYear = cte.DocumentYear 
                   AND a.ispromo = cte.ispromo
WHERE CTE.PERCENTILE < CTE.SaleCount
  AND DATEPART(WEEKDAY, CTE.Dt) < 5
  AND CTE.ispromo = 0 ;

Ошибка

Сообщение 102, уровень 15, состояние 1, строка 12
Неверный синтаксис рядом с конструкцией "=".

Редактировать # 2:

WITH cte AS 
(
    SELECT 
        *,
        DATEPART(WEEKDAY, Dt) AS WeekDay,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) 
              OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear) as PERCENTILE,
        AVG(SaleCount) OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear, DATEPART(WEEKDAY, Dt), IsPromo) AS AVG_WeekDay
    FROM 
        [Action].[dbo].[promo_data_copy]
)
SELECT * 
INTO #temp_table 
FROM cte 

UPDATE a
SET SaleCount = cte.AVG_WeekDay
FROM #temp_table
JOIN #temp_table a ON a.Dt = cte.dt
                   AND a.ItemRelation = cte.ItemRelation 
                   AND a.DocumentNum = cte.DocumentNum 
                   AND a.DocumentYear = cte.DocumentYear 
                   AND a.ispromo = cte.ispromo
WHERE CTE.PERCENTILE < CTE.SaleCount
  AND DATEPART(WEEKDAY, CTE.Dt) < 5
  AND CTE.ispromo = 0 ;

Тогда я получаю много ошибок одного типа

Сообщение 4104, уровень 16, состояние 1, строка 11
Не удалось связать составной идентификатор "cte.dt"

Сообщение 4104, уровень 16, состояние 1, строка 11
Не удалось связать составной идентификатор "cte.ItemRelation"

Сообщение 4104, уровень 16, состояние 1, строка 11
Не удалось связать составной идентификатор "cte.DocumentNum"

Как я могу исправить запрос?

1 Ответ

0 голосов
/ 29 июня 2018

Если я вас правильно понимаю, вы хотите, чтобы CTE занял временную таблицу, которую можно выполнить с помощью:

 with cte as (
    Select *,datePart(WEEKDAY,Dt) as WeekDay,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by ItemRelation,
    DocumentNum, DocumentYear) as PERCENTILE,
    avg(SaleCount) over (Partition by ItemRelation, 
    DocumentNum, DocumentYear,datePart(WEEKDAY,Dt), IsPromo) as AVG_WeekDay
    From [Action].[dbo].[promo_data_copy])

select * into #temp_table from cte 

Редактировать

Если вы хотите вывести записи, которые были обновлены, во временную таблицу, то вам нужно создать временную таблицу и добавить предложение вывода в оператор обновления.

create #temp_table
(
...
)

with cte as (
Select *,datePart(WEEKDAY,Dt) as WeekDay,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY SaleCount) Over (partition by ItemRelation,
DocumentNum, DocumentYear) as PERCENTILE,
avg(SaleCount) over (Partition by ItemRelation, 
DocumentNum, DocumentYear,datePart(WEEKDAY,Dt), IsPromo) as AVG_WeekDay
From [Action].[dbo].[promo_data_copy])
Update a 
Set SaleCount = cte.AVG_WeekDay
output inserted.* into #temp_table
From CTE
join [Action].[dbo].[promo_data_copy] a 
  on a.Dt = cte.dt
 and a.ItemRelation=cte.ItemRelation 
 and a.DocumentNum = cte.DocumentNum 
 and a.DocumentYear = cte.DocumentYear 
 and a.ispromo = cte.ispromo
Where CTE.PERCENTILE < CTE.SaleCount
and datePart(WEEKDAY,CTE.Dt) < 5
and CTE.ispromo = 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...