На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (15) « Первая ... 12 13 [14] 15  все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Спасибо!!! Проверю
      ^D^ima
      PS. На будущее - не ленись указывать СУБД и её версию в КАЖДОМ вопросе...
      PPS. Чего проверять-то - вон он, линк на fiddle. Но предупреждаю сразу - если попадётся кольцо ссылок, будет плохо. Проверку я не делал.
        Akina
        Твой пример сломал мне мозг :wall:
        ExpandedWrap disabled
          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?
        Сатанизм какой-то...
          Цитата ^D^ima @
          Это какая-то рекурсия?

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

          Т.е. в данном случае первая часть выберет в СТЕ записи 2 и 4.
          Вторая часть, используя эти две записи, выберет записи 1 и 3 (по связи с записью 2).
          Следующее выполнение второй части ни одной записи не выберет (она использует в таблице CTE записи 1 и 3, но в таблице нет записей с таким значением поля ID_КорневойПроект).
          На этом накопление закончится. В CTE будут записи 2,4,1,3.
            Цитата ^D^ima @
            Это как вообще?

            До Union all понятно, а SELECT cte.id_k и FROM test, cte не ясно. Это какая-то рекурсия? Т.е. он доходит до FROM test, cte и что что вернет в cte? что было до UNION ALL?
            Сатанизм какой-то...

            Это обычный деревянный(древовидный) запрос, рекурсивный. Причем синтаксис в разных БД может немного отличаться.
              Цитата Wound @
              синтаксис в разных БД может немного отличаться

              Единственные известные мне различия - это:

              - одни СУБД требуют явного указания рекурсивности (WITH RECURSIVE), другим это не требуется;

              - одни СУБД допускают только два подзапроса в рекурсивном CTE, другие не ограничивают их количество;

              - одни СУБД допускают только UNION ALL, другие - и UNION DISTINCT (а при количестве подзапросов более 2 - и то, и другое в любом порядке);

              - одни СУБД требуют явной спецификации выходного набора, другие не против динамического формирования структуры.

              Есть ещё какие известные тебе различия? Чисто из любопытства и для познания...
                Цитата Akina @
                Единственные известные мне различия - это:

                Возможно, я просто сталкивался с ними довольно давненько уже, ньюансы подзабыл, если честно, помню только что пример с PostgresSQL у меня не пошел на MSSQL, пришлось немного модифицировать, чтоб завелся.
                  Коллеги, помогите посчитать.

                  Есть таблица:
                  СотрудникМесяцСуммаКоличество
                  ИвановЯнварь1002
                  ИвановФевраль2002
                  Ивановмарт2
                  ПетровЯнварь1
                  ПетровФевраль2001
                  ПетровМарт1


                  Есть сотрудники, месяцы, суммы выручки. В какие-то месяцы сотрудники могут не иметь выручки. Как посчитать количество месяцев, в которых была выручка?
                  Это можно сделать в то-же самой таблице(столбец количество), или придется делать ещё один запрос
                    ^D^ima
                    Хотелось бы как минимум увидеть требуемый результат для именно показанных исходных данных. Ещё лучше - с подробными пояснениями. Совсем хорошо - если исходные данные будут показаны в виде online fiddle или скриптов CREATE TABLE + INSERT INTO.
                      Помогите в запросе, нужно перемножить поля 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 Кбайт, скачиваний: 93)
                        Цитата Zhydkih @
                        поле Сумма получает текстовое значение

                        Умножение не может вернуть строковое значение.
                        Проверьте - если действительно возвращает строку, то дополнительное умножение IIF(...) на единицу должно привести к ошибке.
                          Если в данном запросе, умножение на единицу к ошибке не приводит, но в поле сумма число разделено не запятой, а точкой и если использовать результаты этого запроса в другом запросе, то любое арифметическое действие над полем Сумма приводит к ошибке.
                          Сообщение отредактировано: Zhydkih -
                            Цитата Zhydkih @
                            в поле сумма число разделено не запятой, а точкой

                            Ась? какая нафиг запятая??? разделитель целой и дробной части - это точка.
                            Цитата Zhydkih @
                            если использовать результаты этого запроса в другом запросе, то любое арифметическое действие над полем Сумма приводит к ошибке.

                            Как конкретно использовать? этот запрос включается в источник данных как подзапрос или CTE?
                              Это SQL запрос к серверу из Access, данные нужны для дальнейшей обработки, а так как, если я правильно понял, разделителем частей является точка, то Access воспринимает поле Сумма как текст и не дает далее производить арифметические действия.
                                Цитата Zhydkih @
                                Это SQL запрос к серверу из Access

                                А курсор, конечно, клиентский. А Аксесс русифицированный. Ну-ну...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0498 ]   [ 18 queries used ]   [ Generated: 28.03.24, 18:27 GMT ]