Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Спецы, поделитесь пожалуйста best practice.

Имеется CTE собраный из нескольких селектов.
Требуется сделать выборку из этого CTE с урезанным набором полей (соотвественно схлопнутся записи), добавить к этому одно поле (нацепить на каждую запись некое вычисление) и приджойнить добавленное поле обратно к изначальному CTE.

Что посоветуете? Вью? Табличную функцию? Может можно как-то вложить CTE в CTE ? Etc...?

Спасибо.
3 дек 17, 17:49    [21002434]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
Тут еще друидский круг нужен, как без него CTE в CTE вкладывать-то?...

З.Ы. Берете и делаете
3 дек 17, 19:14    [21002515]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
slovnet
Может можно как-то вложить CTE в CTE ? Etc...?
Через запятую. Посмотрите справку с примерами по CTE
3 дек 17, 19:21    [21002519]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Гавриленко Сергей Алексеевич,

Я так понял здесь специалисты отвечают на вопросы новичков.
Вот мне понадобилось решить задачу на T-SQL , на котором обычно не пишу.
Вот у меня вопрос.
Причём не прошу код за меня написать. Прошу описать в паре предложений как обычно такие вопросы решаются.

К чему это глумление?

Заранее спасибо за конструктивную помощь.
3 дек 17, 19:26    [21002525]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
alexeyvg,

Спасибо, посмотрю. Раньше что-то не нагуглилось такое.
3 дек 17, 19:27    [21002529]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
slovnet
alexeyvg,

Спасибо, посмотрю. Раньше что-то не нагуглилось такое.
Лучше справку смотреть, а не гуглить (хотя справка у МС ухудшается с каждым годом).
Просто после определения CTE ставите запятую, и пишите новое определение CTE, в котором можно использовать предыдущее (все предыдущие).

Пример из справки "C. Using multiple CTE definitions in a single query"
WITH Sales_CTE (SalesPersonID, TotalSales, SalesYear)  
AS  
-- Define the first CTE query.  
(  
    SELECT SalesPersonID, SUM(TotalDue) AS TotalSales, YEAR(OrderDate) AS SalesYear  
    FROM Sales.SalesOrderHeader  
    WHERE SalesPersonID IS NOT NULL  
       GROUP BY SalesPersonID, YEAR(OrderDate)  
  
)  
,   -- Use a comma to separate multiple CTE definitions.  
  
-- Define the second CTE query, which returns sales quota data by year for each sales person.  
Sales_Quota_CTE (BusinessEntityID, SalesQuota, SalesQuotaYear)  
AS  
(  
       SELECT BusinessEntityID, SUM(SalesQuota)AS SalesQuota, YEAR(QuotaDate) AS SalesQuotaYear  
       FROM Sales.SalesPersonQuotaHistory  
       GROUP BY BusinessEntityID, YEAR(QuotaDate)  
)  
  
-- Define the outer query by referencing columns from both CTEs.  
SELECT SalesPersonID  
  , SalesYear  
  , FORMAT(TotalSales,'C','en-us') AS TotalSales  
  , SalesQuotaYear  
  , FORMAT (SalesQuota,'C','en-us') AS SalesQuota  
  , FORMAT (TotalSales -SalesQuota, 'C','en-us') AS Amt_Above_or_Below_Quota  
FROM Sales_CTE  
JOIN Sales_Quota_CTE ON Sales_Quota_CTE.BusinessEntityID = Sales_CTE.SalesPersonID  
                    AND Sales_CTE.SalesYear = Sales_Quota_CTE.SalesQuotaYear  
ORDER BY SalesPersonID, SalesYear;  
GO
3 дек 17, 19:40    [21002544]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
alexeyvg,

Моя задача чуть сложнее. Мне нужно второй CTE селектить из результата первого.
3 дек 17, 19:46    [21002553]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
А, увидел. Обращение к первому CTE тоже работает.

Огромное спасибо! Это то что искал.
3 дек 17, 19:54    [21002569]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
slovnet
К чему это глумление?

Заранее спасибо за конструктивную помощь.
"Мне надо забить гвоздь. Что посоветуете? Бить правой рукой? Бить с разбега? Или повыше прыгнуть? Может как-то можно гвоздь молотком забить? Вот мне понадобилось решить задачу, которой обычно не занимаюсь. Причём не прошу сделать это за меня. Прошу описать в паре предложений как обычно такие вопросы решаются.".

Вам самому не смешно? Уж простите, в ответе не больше глумления, чем вы своим вопросом продемонстрировали. В справке все уже давно с примерами расписано.

Заранее спасибо за адекватные вопросы.

Сообщение было отредактировано: 4 дек 17, 01:04
4 дек 17, 00:45    [21002915]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Гавриленко Сергей Алексеевич,

Клоунада не делает Вам чести.

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

Уважаемый alexeyvg счёл мой вопрос адекватным - и помог. Спасибо ему.

Вы же предпочли глумиться.

Нет, мне не жалко, наздоровье. Главное, получил ответ на свой вопрос.
Да и Вас воспитывать не претендую - поди взрослый дядя.
Спасибо что модерируете этот форум.
4 дек 17, 01:21    [21002929]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
slovnet
Уважаемый alexeyvg счёл мой вопрос адекватным - и помог. Спасибо ему.
Уважаемый alexeyvg -- поблагодарим же его за терпение -- вам перепечатал хелп синтаксиса.
slovnet
Забивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.
Т.е за два часа не смогли найти и осилить примеры к синтаксису, который гуглится за 30 секунд. Если это нетривиально, то у меня для вас плохие новости, ага.

Спасибо за интересный вопрос (два).

Сообщение было отредактировано: 4 дек 17, 01:43
4 дек 17, 01:37    [21002939]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
slovnet
Забивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.
А вы не гуглите, не надо, по отдельным командам это точно непродуктивно.
Возникла задача, тем более конкретно с командой CTE, так читайте сразу в хелпе, с примерами. Это точно бы не заняло несколько часов.
4 дек 17, 08:31    [21003069]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
alexeyvg,

Спасибо за совет насчёт хелп vs гугл. Буду знать.

Я видел этот хелп. И делал такое не раз. Но это пример обычного CTE.
А мне надо было результат уже сведённых таблиц отфильтровать дистинктом по части полей и нацепить на него нарастающий итог.
Такого примера в хелпе нет. Не пришло в голову что можно тупо выбрать из предыдущей таблицы CTE.
Пытался сложить CTE во вью и приджойнить к нему ещё один CTE, но понимал что это неправильный ход. Поэтому здесь спросил.

Ещё раз спасибо, ваша помощь это как раз пример того как можно потратив 5 минут сэкономить другому пару часов поисков.
4 дек 17, 09:53    [21003178]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet,

точно в хедп смотрели?

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql

C. Using multiple CTE definitions in a single query
4 дек 17, 09:55    [21003182]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Гавриленко Сергей Алексеевич,

Уважаемый мэтр,
Покажите пожалуйста мастер-класс тривиального нахождения гуглом за 5 минут решения моей задачи обозначенной в первом сообщении.
То есть пример синтаксиса который решит именно эту задачу.

Спасибо.
4 дек 17, 10:10    [21003216]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Sql cte usage

https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

1я ссылка в гугле
4 дек 17, 10:14    [21003225]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
Alexander Us
Member

Откуда:
Сообщений: 1130
Гавриленко Сергей Алексеевич,

при всём (огромном) уважении, зря Вы так сегодня.
4 дек 17, 10:18    [21003235]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

Спасибо.

Я читал этот хелп. И сейчас ещё раз посмотрел.
Этого недостаточно было для решения моей задачи.
Я делал как в этом примере, до того как сдесь спросил. Этого давало декартово произведение. И дистинкт тут не поможет.
4 дек 17, 10:27    [21003269]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Cammomile,

И как эта ссылка даёт ответ на поставленный вопрос.
Вы первое сообщение читали?
4 дек 17, 10:31    [21003284]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet,

автор
Этого давало декартово произведение.

что-то всё хуже и хуже.. cte само вам умножало? жестокая штука....

*сдесь :)
4 дек 17, 10:32    [21003292]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
Уважаемый TaPaK,

Вы первое сообщение читали? Я прямо там всё объяснил.

В CTE да, умножаются строки, мне именно так и надо.
Но нарастающий итог надо нацепить на схлопнутую выборку, по урезанному количеству полей.
То есть надо взять результат готового CTE, сделать по нему дистинкт по части полей, потом в этой уже схлопнутой выборке добавить ROW_NUMBER() OVER (PARTITION BY... и к этому прицепить нарастающий итог а потом приджойнить результат к изначальной умноженной выборке.

Есть такой пример в хелпе?

P.S. *сдесь - опечатка, печатаю транслитом.
4 дек 17, 10:47    [21003371]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet,

автор
То есть надо взять результат готового CTE
да в хелпе есть пример использования как минимум двух результатов cte
4 дек 17, 10:51    [21003385]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

Ну вот и ткните меня носом в синтаксис который решит именно эту задачу.

P.S.
Надо понимать, насчёт умножения записей уже не так плохо и жёстко?
И почему приведенный Вами раньше пример не подходит тоже разобрались?

P.P.S
Мне ж не жалко, пусть мне покажут что не умею читать хелп и покажут где именно пропустил нужное.
Только спасибо скажу. Век живи..
4 дек 17, 10:59    [21003431]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
slovnet,

на вопрос как использовать результат cte в другом хелп отвечает? при чём здесь ваши извращённые желания умножать делить и тп к синтаксису и bol????
4 дек 17, 11:02    [21003442]     Ответить | Цитировать Сообщить модератору
 Re: Best practice по сведению двух CTE  [new]
slovnet
Member

Откуда:
Сообщений: 141
TaPaK,

Как использовать результат cte внутри другого cte?
Не нашёл там.
Пожалуйста, укажите литеру примера.
4 дек 17, 11:13    [21003496]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить