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

Модераторы: Akina
Страницы: (15) [1] 2 3 ...  14 15 все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    SQL server 2014 + SQL management studio.

    Запрос:
    user posted image
    ExpandedWrap disabled
      SELECT     Payment.Number, Payment.Date, PaymentDetail.ID AS PaymentDetailID, PaymentDetail.Value, Invoice.FileAs, Invoice.Number AS Expr1, Project.FileAs AS Expr2
      FROM         PaymentDetail INNER JOIN
                            Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                            Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                            Project ON Invoice.ProjectID = Project.ID INNER JOIN
                            DocumentCategory ON Project.ID = DocumentCategory.DocumentID INNER JOIN
                            Category ON DocumentCategory.CategoryID = Category.ID
      ORDER BY Payment.Date


    Проблема:
    В таблице DocumentCategory присутствуют не все значения из таблицы Project, следовательно итоговая таблица усекается до не пустых вхождений(с 1000 до 700)

    Вопрос:
    Как запрос построить таким образом, что если DocumentCategory.DocumentID не найден, то вместо него(ну и дальше в Category) просто писалось null и все(т.е. число записей осталось 1000).
    Сообщение отредактировано: Akina -
      ExpandedWrap disabled
         
      LEFT JOIN DocumentCategory
        Бинго!!!

        Akina
        Не напомнишь, как называется функция объединения(суммирования) строк?

        1СИНИЙ
        2КРАСНЫЙ
        3СИНИЙ


        суммировались в
        4СИНИЙ
        2КРАСНЫЙ
          Цитата ^D^ima @
          как называется функция объединения(суммирования) строк?

          Это шутка такая? у тебя суммируются числа, а не строки. SUM() ... А по строке выполняется группировка. GROUP BY ...
          Сообщение отредактировано: Akina -
            Ошибка:
            ExpandedWrap disabled
              SELECT     /*Payment.Date, Payment.FileAs AS Payment,*/ Payment.TotalWithVATBC, /*Project.FileAs AS Project,*/ Category.FileAs AS Category
              FROM         PaymentDetail INNER JOIN
                                    Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                                    Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                                    Project ON Invoice.ProjectID = Project.ID LEFT OUTER JOIN
                                    DocumentCategory ON Project.ID = DocumentCategory.DocumentID LEFT OUTER JOIN
                                    Category ON DocumentCategory.CategoryID = Category.ID
              WHERE     (Payment.FileAs NOT LIKE N'%-1%') AND (Payment.FileAs NOT LIKE N'%-3%') and (Payment.Date between '01.01.2017' and '31.12.2017' )
              /*ORDER BY Payment.Date*/
              GROUP BY Payment.TotalWithVATBC


            Сообщение 8120, уровень 16, состояние 1, строка 1
            Столбец "Category.FileAs" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

            Добавлено
            Мне что-то типа такого нужно:
            ExpandedWrap disabled
              GROUP BY Category.FileAs,sum(Payment.TotalWithVATBC)

            Чтобы для одинаковых Category.FileAs суммировались их Payment.TotalWithVATBC
              Так получилось, всем спасибо.
              ExpandedWrap disabled
                SELECT     /*Payment.Date, Payment.FileAs AS Payment,*/ sum(Payment.TotalWithVATBC), /*Project.FileAs AS Project,*/ Category.FileAs AS Category
                FROM         PaymentDetail INNER JOIN
                                      Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                                      Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                                      Project ON Invoice.ProjectID = Project.ID LEFT OUTER JOIN
                                      DocumentCategory ON Project.ID = DocumentCategory.DocumentID LEFT OUTER JOIN
                                      Category ON DocumentCategory.CategoryID = Category.ID
                WHERE     (Payment.FileAs NOT LIKE N'%-1%') AND (Payment.FileAs NOT LIKE N'%-3%') and (Payment.Date between '01.01.2017' and '31.12.2017' )
                 
                /*ORDER BY Payment.Date*/
                GROUP BY Category.FileAs
                Цитата ^D^ima @
                Так получилось

                Мне неизвестна физическая сущность хранящихся в таблицах сведений, но создаётся впечатление, что запрос избыточен. Как я понимаю, не может быть такого, чтобы в DocumentCategory присутствовала запись о CategoryID, к которой нет соответствующей записи в таблице Category. Но если так, то нет смысла связывать таблицу Category левым связыванием, достаточно внутреннего. А если поле Category.ID уникально (а на показанной схеме это вообще первичный ключ) - то таблицу Category вообще можно удалить из списка таблиц-источников запроса.
                  Akina
                  Спасибо за совет.

                  А можно так сделать, чтобы Category.FileAs AS Category объединяло все найденные варианты в 1 строку.

                  Я имею в виду что если для Project.ID найдется несколько DocumentCategory.DocumentID и Category.ID чтобы эти строки в 1 объединились?

                  ДокументКатегория
                  1Категория 1
                  1Категория 2


                  переделалось в

                  ДокументКатегория
                  1Категория 1, Категория 2
                    Цитата ^D^ima @
                    А можно так сделать, чтобы Category.FileAs AS Category объединяло все найденные варианты в 1 строку.

                    У Вас MS SQL. Если версия позволяет, то можете использовать STRING_AGG. Иначе разве что через FOR XML.
                    Сообщение отредактировано: Akina -
                      помогите отформатировать число.

                      Я хочу чтобы сотые отделялись запятой(12345,67)
                      А то получается что SQL management studio выдает корректно, с запятой, а при обработке того-же запроса через sqlcmd получается точка
                      Я написал так:
                      ExpandedWrap disabled
                        Format( sum(PaymentDetail.Value) , '#,00') AS Сумма

                      но почему-то дробную часть вообще отсекает

                      Добавлено
                      или придется переводить в строку и делать replace?
                        Вместо
                        ExpandedWrap disabled
                          sum(PaymentDetail.Value) AS Сумма


                        Стало:
                        ExpandedWrap disabled
                          SELECT   replace( CAST(  sum(PaymentDetail.Value) as varchar(20) ) ,'.',',')AS Сумма


                        Так заработало, но как-то череопно выглядит. PaymentDetail.Value имеет тип данных money
                          Цитата ^D^ima @
                          SQL management studio выдает корректно, с запятой

                          Потому что SSMS - это средств отображения, которое форматирует результат, используя установленный системный или настраиваемый разделитель/формат.
                          Цитата ^D^ima @
                          при обработке того-же запроса через sqlcmd получается точка

                          А sqlcmd отдаёт результат as is, используя стандартный разделитель.
                          Цитата ^D^ima @
                          Так заработало, но как-то череопно выглядит.

                          Попробуй
                          ExpandedWrap disabled
                            Format( sum(PaymentDetail.Value) , N'#.00', N'ru-ru') AS Сумма
                            :thanks:
                              Цитата Akina @
                              N

                              Что означает N в формате?
                                Цитата ^D^ima @
                                Что означает N в формате?

                                Если посмотреть описание функции Format, то увидишь. что второй и третий параметры имеют тип Nvarchar, а не просто varchar.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (15) [1] 2 3 ...  14 15 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0400 ]   [ 16 queries used ]   [ Generated: 28.03.24, 11:22 GMT ]