Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE / 25 сообщений из 98, страница 1 из 4
03.12.2017, 17:49:38
    #39563317
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Спецы, поделитесь пожалуйста best practice.

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

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

Спасибо.
...
Рейтинг: 0 / 0
03.12.2017, 19:14:06
    #39563335
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Тут еще друидский круг нужен, как без него CTE в CTE вкладывать-то?...

З.Ы. Берете и делаете
...
Рейтинг: 0 / 0
03.12.2017, 19:21:01
    #39563336
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnetМожет можно как-то вложить CTE в CTE ? Etc...?Через запятую. Посмотрите справку с примерами по CTE
...
Рейтинг: 0 / 0
03.12.2017, 19:26:51
    #39563338
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Гавриленко Сергей Алексеевич,

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

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

Заранее спасибо за конструктивную помощь.
...
Рейтинг: 0 / 0
03.12.2017, 19:27:58
    #39563340
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
alexeyvg,

Спасибо, посмотрю. Раньше что-то не нагуглилось такое.
...
Рейтинг: 0 / 0
03.12.2017, 19:40:03
    #39563344
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnetalexeyvg,

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

Пример из справки "C. Using multiple CTE definitions in a single query"
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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
...
Рейтинг: 0 / 0
03.12.2017, 19:46:18
    #39563347
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
alexeyvg,

Моя задача чуть сложнее. Мне нужно второй CTE селектить из результата первого.
...
Рейтинг: 0 / 0
03.12.2017, 19:54:56
    #39563352
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
А, увидел. Обращение к первому CTE тоже работает.

Огромное спасибо! Это то что искал.
...
Рейтинг: 0 / 0
04.12.2017, 00:45:14
    #39563388
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnetК чему это глумление?

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

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

Заранее спасибо за адекватные вопросы.
...
Рейтинг: 0 / 0
04.12.2017, 01:21:12
    #39563392
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Гавриленко Сергей Алексеевич,

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

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

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

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

Нет, мне не жалко, наздоровье. Главное, получил ответ на свой вопрос.
Да и Вас воспитывать не претендую - поди взрослый дядя.
Спасибо что модерируете этот форум.
...
Рейтинг: 0 / 0
04.12.2017, 01:37:22
    #39563395
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnetУважаемый alexeyvg счёл мой вопрос адекватным - и помог. Спасибо ему.Уважаемый alexeyvg -- поблагодарим же его за терпение -- вам перепечатал хелп синтаксиса.
slovnetЗабивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.
Т.е за два часа не смогли найти и осилить примеры к синтаксису, который гуглится за 30 секунд. Если это нетривиально, то у меня для вас плохие новости, ага.

Спасибо за интересный вопрос (два).
...
Рейтинг: 0 / 0
04.12.2017, 08:31:59
    #39563425
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnetЗабивание гвоздя - операция простая, интуитивная, в один цикл.
Мне надо было произвести операцию в несколько циклов, один из которых пользуется результатом предыдущего. Никак с забиванием гвоздя не сравнить.
Для незнакомой среды - нетривиально. Потратил несколько часов на попытку самостоятельного решения.А вы не гуглите, не надо, по отдельным командам это точно непродуктивно.
Возникла задача, тем более конкретно с командой CTE, так читайте сразу в хелпе, с примерами. Это точно бы не заняло несколько часов.
...
Рейтинг: 0 / 0
04.12.2017, 09:53:05
    #39563467
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
alexeyvg,

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

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

Ещё раз спасибо, ваша помощь это как раз пример того как можно потратив 5 минут сэкономить другому пару часов поисков.
...
Рейтинг: 0 / 0
04.12.2017, 09:55:32
    #39563469
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
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
...
Рейтинг: 0 / 0
04.12.2017, 10:10:57
    #39563478
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Гавриленко Сергей Алексеевич,

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

Спасибо.
...
Рейтинг: 0 / 0
04.12.2017, 10:14:03
    #39563481
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
...
Рейтинг: 0 / 0
04.12.2017, 10:18:40
    #39563486
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Гавриленко Сергей Алексеевич,

при всём (огромном) уважении, зря Вы так сегодня.
...
Рейтинг: 0 / 0
04.12.2017, 10:27:54
    #39563492
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
TaPaK,

Спасибо.

Я читал этот хелп. И сейчас ещё раз посмотрел.
Этого недостаточно было для решения моей задачи.
Я делал как в этом примере, до того как сдесь спросил. Этого давало декартово произведение. И дистинкт тут не поможет.
...
Рейтинг: 0 / 0
04.12.2017, 10:31:08
    #39563495
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Cammomile,

И как эта ссылка даёт ответ на поставленный вопрос.
Вы первое сообщение читали?
...
Рейтинг: 0 / 0
04.12.2017, 10:32:14
    #39563496
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnet,

авторЭтого давало декартово произведение.
что-то всё хуже и хуже.. cte само вам умножало? жестокая штука....

*сдесь :)
...
Рейтинг: 0 / 0
04.12.2017, 10:47:54
    #39563507
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
Уважаемый TaPaK,

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

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

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

P.S. *сдесь - опечатка, печатаю транслитом.
...
Рейтинг: 0 / 0
04.12.2017, 10:51:12
    #39563509
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnet,

авторТо есть надо взять результат готового CTE да в хелпе есть пример использования как минимум двух результатов cte
...
Рейтинг: 0 / 0
04.12.2017, 10:59:40
    #39563520
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
TaPaK,

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

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

P.P.S
Мне ж не жалко, пусть мне покажут что не умею читать хелп и покажут где именно пропустил нужное.
Только спасибо скажу. Век живи..
...
Рейтинг: 0 / 0
04.12.2017, 11:02:12
    #39563524
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
slovnet,

на вопрос как использовать результат cte в другом хелп отвечает? при чём здесь ваши извращённые желания умножать делить и тп к синтаксису и bol????
...
Рейтинг: 0 / 0
04.12.2017, 11:13:51
    #39563540
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Best practice по сведению двух CTE
TaPaK,

Как использовать результат cte внутри другого cte?
Не нашёл там.
Пожалуйста, укажите литеру примера.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE / 25 сообщений из 98, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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