Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.82.140.17] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (15) « Первая ... 12 13 [14] 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#196
,
|
|
|
Спасибо!!! Проверю
|
Сообщ.
#197
,
|
|
|
^D^ima
PS. На будущее - не ленись указывать СУБД и её версию в КАЖДОМ вопросе... PPS. Чего проверять-то - вон он, линк на fiddle. Но предупреждаю сразу - если попадётся кольцо ссылок, будет плохо. Проверку я не делал. |
Сообщ.
#198
,
|
|
|
Akina
Твой пример сломал мне мозг WITH cte AS ( SELECT id id_k, id_p, id, p, money FROM test WHERE id_k IS NULL UNION ALL SELECT cte.id_k, test.id_p, test.id, test.p, test.money FROM test, cte WHERE cte.id = test.id_k ) Это как вообще? До Union all понятно, а SELECT cte.id_k и FROM test, cte не ясно. Это какая-то рекурсия? Т.е. он доходит до FROM test, cte и что что вернет в cte? что было до UNION ALL? Сатанизм какой-то... |
Сообщ.
#199
,
|
|
|
Цитата ^D^ima @ Это какая-то рекурсия? Точно. Таблица CTE накапливает записи, поставляемые запросом, и в то же время используется как источник данных для его второй части. Та часть запроса, что до UNION, выполняется один раз и в самом начале, выбирая некие записи в CTE. Затем выполняется вторая часть, много раз, при этом используются те записи из накопленных уже в CTE, которые ранее во второй части не использовались (т.е. при первом выполнении - вставленные первой частью, при втором - вставленные первой частью при первом выполнении, при третьем - ... и так продолжается до тех пор, пока на очередном витке ни одной записи второй частью не будет вставлено). Т.е. в данном случае первая часть выберет в СТЕ записи 2 и 4. Вторая часть, используя эти две записи, выберет записи 1 и 3 (по связи с записью 2). Следующее выполнение второй части ни одной записи не выберет (она использует в таблице CTE записи 1 и 3, но в таблице нет записей с таким значением поля ID_КорневойПроект). На этом накопление закончится. В CTE будут записи 2,4,1,3. |
Сообщ.
#200
,
|
|
|
Цитата ^D^ima @ Это как вообще? До Union all понятно, а SELECT cte.id_k и FROM test, cte не ясно. Это какая-то рекурсия? Т.е. он доходит до FROM test, cte и что что вернет в cte? что было до UNION ALL? Сатанизм какой-то... Это обычный деревянный(древовидный) запрос, рекурсивный. Причем синтаксис в разных БД может немного отличаться. |
Сообщ.
#201
,
|
|
|
Цитата Wound @ синтаксис в разных БД может немного отличаться Единственные известные мне различия - это: - одни СУБД требуют явного указания рекурсивности (WITH RECURSIVE), другим это не требуется; - одни СУБД допускают только два подзапроса в рекурсивном CTE, другие не ограничивают их количество; - одни СУБД допускают только UNION ALL, другие - и UNION DISTINCT (а при количестве подзапросов более 2 - и то, и другое в любом порядке); - одни СУБД требуют явной спецификации выходного набора, другие не против динамического формирования структуры. Есть ещё какие известные тебе различия? Чисто из любопытства и для познания... |
Сообщ.
#202
,
|
|
|
Цитата Akina @ Единственные известные мне различия - это: Возможно, я просто сталкивался с ними довольно давненько уже, ньюансы подзабыл, если честно, помню только что пример с PostgresSQL у меня не пошел на MSSQL, пришлось немного модифицировать, чтоб завелся. |
Сообщ.
#203
,
|
|||||||||||||||||||||||||||||
|
Коллеги, помогите посчитать.
Есть таблица:
Есть сотрудники, месяцы, суммы выручки. В какие-то месяцы сотрудники могут не иметь выручки. Как посчитать количество месяцев, в которых была выручка? Это можно сделать в то-же самой таблице(столбец количество), или придется делать ещё один запрос |
Сообщ.
#204
,
|
|
|
^D^ima
Хотелось бы как минимум увидеть требуемый результат для именно показанных исходных данных. Ещё лучше - с подробными пояснениями. Совсем хорошо - если исходные данные будут показаны в виде online fiddle или скриптов CREATE TABLE + INSERT INTO. |
Сообщ.
#205
,
|
|
|
Помогите в запросе, нужно перемножить поля Price и Quantity, но поле Сумма получает текстовое значение, как получить числовое значение в поле Сумма?
SELECT YEAR(dbo.Documents.DocDate) AS Год, MONTH(dbo.Documents.DocDate) AS Месяц,dbo.DocumentRows.OfficeID, dbo.DocumentRows.Quantity, dbo.DocumentRows.Price, iif(dbo.DocumentRows.CrID=1 AND dbo.DocumentRows.FlagCr=1, [Quantity] * [Price] , -1 * [Quantity] * [Price]) AS Сумма FROM dbo.Documents INNER JOIN dbo.DocumentRows ON dbo.Documents.ID = dbo.DocumentRows.DocID WHERE dbo.Documents.DocDate>='01.01.2020' AND dbo.DocumentRows.DbID=1 AND dbo.DocumentRows.FlagDb=1 AND dbo.Documents.State=1 OR dbo.Documents.DocDate>='01.01.2020' AND dbo.Documents.State=1 AND dbo.DocumentRows.CrID=1 AND dbo.DocumentRows.FlagCr=1; Прикреплённый файл____________.png (21,81 Кбайт, скачиваний: 102) |
Сообщ.
#206
,
|
|
|
Цитата Zhydkih @ поле Сумма получает текстовое значение Умножение не может вернуть строковое значение. Проверьте - если действительно возвращает строку, то дополнительное умножение IIF(...) на единицу должно привести к ошибке. |
Сообщ.
#207
,
|
|
|
Если в данном запросе, умножение на единицу к ошибке не приводит, но в поле сумма число разделено не запятой, а точкой и если использовать результаты этого запроса в другом запросе, то любое арифметическое действие над полем Сумма приводит к ошибке.
|
Сообщ.
#208
,
|
|
|
Цитата Zhydkih @ в поле сумма число разделено не запятой, а точкой Ась? какая нафиг запятая??? разделитель целой и дробной части - это точка. Цитата Zhydkih @ если использовать результаты этого запроса в другом запросе, то любое арифметическое действие над полем Сумма приводит к ошибке. Как конкретно использовать? этот запрос включается в источник данных как подзапрос или CTE? |
Сообщ.
#209
,
|
|
|
Это SQL запрос к серверу из Access, данные нужны для дальнейшей обработки, а так как, если я правильно понял, разделителем частей является точка, то Access воспринимает поле Сумма как текст и не дает далее производить арифметические действия.
|
Сообщ.
#210
,
|
|
|
Цитата Zhydkih @ Это SQL запрос к серверу из Access А курсор, конечно, клиентский. А Аксесс русифицированный. Ну-ну... |