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

Модераторы: Akina
Страницы: (15) 1 2 [3] 4 5 ...  14 15 все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Тогда почему надо суммировать PaymentDetail.Value?
      можно не суммировать
        :'(:'(:'(:'(:'(:'(:'(:'(:'(
          ^D^ima
          Не, давай так. Переноси структуры и пример наполнения в Access, и выкладывай полученную базу, с указанием, какой должен получиться результат на этом наполнении. Будем смотреть.
            Akina
            Прошу прощения, был недостаточно нагляден.

            С Access тяжело, сделал все наглядно:
            Запрос:
            ExpandedWrap disabled
              use PJM10
              SELECT   (PaymentDetail.Value) AS СуммаПриход,Company.FileAs AS Компания,   Project.FileAs as Проект, sum(Expense.TotalPC) AS СуммаРасхода
               
              FROM         PaymentDetail
                                      INNER JOIN Payment ON PaymentDetail.PaymentID = Payment.ID
                                      INNER JOIN   Company ON Payment.PayerCompanyID = Company.ID
                                      INNER JOIN Invoice ON PaymentDetail.InvoiceID = Invoice.ID
                                    
                                    INNER JOIN Project ON Invoice.ProjectID = Project.ID
                                  inner JOIN Expense ON Project.ID = Expense.ProjectID
               
              where Company.FileAs ='Идиллия'
              GROUP BY PaymentDetail.Value, Company.FileAs,    Project.FileAs

            Результат:
            user posted image

            Что хочу:
            Получить только 1 строку в которой:
            user posted image
              Гм... А что получится на тех же данных, если обернуть PaymentDetail.Value в SUM() и убрать из выражения группировки?

              В самом крайнем случае
              ExpandedWrap disabled
                SELECT SUM(СуммаПриход) AS СуммаПриход, Компания, Проект, СуммаРасхода
                FROM (твой запрос) AS dummy
                GROUP BY Компания, Проект


              Цитата ^D^ima @
              С Access тяжело

              Что там тяжёлого? Открыть Access, создать новую БД, импортировать туда таблицы и почистить от лишних данных (если данных слишком дофига, то импортировать структуры, а потом запросами скопировать немного данных), сжать, зипануть - и всё.
              Сообщение отредактировано: Akina -
                Цитата Akina @
                Гм... А что получится на тех же данных, если обернуть PaymentDetail.Value в SUM() и убрать из выражения группировки?

                Вопрос верный, я так уже делал, он СуммаРасхода суммирует а СуммаПриход вообще треш непонятный:

                user posted image

                По поводу аксеса, там вообще не принципиально, достаточно 2 таблицы связанные сделать, накидаю сейчас

                Добавлено
                Akina
                ДАААААААААААА, через запрос в запросе все срослась!!!!!!:dance::dance::dance:

                Добавлено
                Наверное последний вопрос:
                ExpandedWrap disabled
                  SELECT SUM(СуммаПриход) AS СуммаПриход, Компания, СуммаРасхода
                   
                  from
                   
                  (SELECT   (PaymentDetail.Value) AS СуммаПриход,Company.FileAs AS Компания,    sum(Expense.TotalPC) AS СуммаРасхода
                   
                  FROM         PaymentDetail
                                          INNER JOIN Payment ON PaymentDetail.PaymentID = Payment.ID
                                          INNER JOIN   Company ON Payment.PayerCompanyID = Company.ID
                                          INNER JOIN Invoice ON PaymentDetail.InvoiceID = Invoice.ID
                                        
                                        INNER JOIN Project ON Invoice.ProjectID = Project.ID
                                      inner JOIN Expense ON Project.ID = Expense.ProjectID
                   
                  GROUP BY PaymentDetail.Value, Company.FileAs
                  ) as dummy
                  where компания ='Идиллия' or компания ='Авангард ОАО'
                  GROUP BY  Компания, СуммаРасхода

                дает
                user posted image

                Как-то можно свернуть ещё по компаниям другим мпособом, кроме как ещё делать запрос в запросе, в котором запрос?
                ExpandedWrap disabled
                  use PJM10
                   
                  Select sum(СуммаПриход)as СуммаПриход, Компания, sum(СуммаРасхода) as СуммаРасхода
                  from(
                   
                  SELECT SUM(СуммаПриход) AS СуммаПриход, Компания, СуммаРасхода
                   
                  from
                   
                  (SELECT   (PaymentDetail.Value) AS СуммаПриход,Company.FileAs AS Компания,    sum(Expense.TotalPC) AS СуммаРасхода
                   
                  FROM         PaymentDetail
                                          INNER JOIN Payment ON PaymentDetail.PaymentID = Payment.ID
                                          INNER JOIN   Company ON Payment.PayerCompanyID = Company.ID
                                          INNER JOIN Invoice ON PaymentDetail.InvoiceID = Invoice.ID
                                        
                                        INNER JOIN Project ON Invoice.ProjectID = Project.ID
                                      inner JOIN Expense ON Project.ID = Expense.ProjectID
                   
                  GROUP BY PaymentDetail.Value, Company.FileAs
                  ) as dummy
                  where компания ='Идиллия' or компания ='Авангард ОАО'
                  GROUP BY  Компания, СуммаРасхода) as dummy2
                   
                  GROUP BY  Компания
                  order by Компания


                Добавлено
                user posted image
                  "Средний" подзапрос - лишний.
                  ExpandedWrap disabled
                    Select sum(СуммаПриход)as СуммаПриход, Компания, sum(СуммаРасхода) as СуммаРасхода
                    from (
                             SELECT PaymentDetail.Value AS СуммаПриход, Company.FileAs AS Компания, sum(Expense.TotalPC) AS СуммаРасхода
                             FROM PaymentDetail
                             INNER JOIN Payment ON PaymentDetail.PaymentID = Payment.ID
                             INNER JOIN   Company ON Payment.PayerCompanyID = Company.ID
                             INNER JOIN Invoice ON PaymentDetail.InvoiceID = Invoice.ID
                             INNER JOIN Project ON Invoice.ProjectID = Project.ID
                             inner JOIN Expense ON Project.ID = Expense.ProjectID
                             GROUP BY PaymentDetail.Value, Company.FileAs
                         ) as dummy
                    GROUP BY  Компания
                    order by Компания
                    пришло в голову такое решение:
                    Если и платеж и расход связан с клиентом, то можно взять одним запросом все расходы, в другом все платежи и в условии where связать через названия клиента, получится как-то лаконичней

                    ExpandedWrap disabled
                      use PJM10
                      Select sum(PaymentDetail.Value) AS СуммаПриход, innerQuery.Компания, innerQuery.СуммаРасхода
                       
                      from PaymentDetail
                                              INNER JOIN Payment ON PaymentDetail.PaymentID = Payment.ID
                                              INNER JOIN   Company ON Payment.PayerCompanyID = Company.ID,
                       
                       
                      (SELECT   Company.FileAs AS Компания,    sum(Expense.TotalPC) AS СуммаРасхода
                       
                      FROM         Expense            
                                
                                            INNER JOIN Project ON Expense.ProjectID = Project.ID
                                            INNER JOIN   Company ON Project.CustomerCompanyID = Company.ID
                                          
                       
                      GROUP BY Company.FileAs) as innerQuery
                      where Company.FileAs=innerQuery.Компания and (Payment.FileAs LIKE N'%-1%')
                      group by innerQuery.Компания, innerQuery.СуммаРасхода
                      order by innerQuery.Компания
                    Сообщение отредактировано: ^D^ima -
                      Цитата ^D^ima @
                      пришло в голову такое решение

                      Подход правильный. Реализация - кривая.
                      Сделай два запроса, в каждом посчитай свою сумму. Оба их используй как подзапросы в секции FROM, связав по полю Компания. Само это поле возьми из любого из подзапросов, всё одно равны.
                        Цитата Akina @
                        делай два запроса, в каждом посчитай свою сумму. Оба их используй как подзапросы в секции FROM, связав по полю Компания.

                        несколько не понял

                        ExpandedWrap disabled
                          use PJM10
                           
                          Select  innerQuery1.Компания, innerQuery1.СуммаПриход, innerQuery2.СуммаРасхода
                           
                          From
                          Company on Company.FileAs =innerQuery1.Компания=innerQuery2.Компания, -- Тут что-то не вяжется
                           
                          (Select  Company.FileAs as Компания, sum(PaymentDetail.Value) AS СуммаПриход
                           
                          from Company
                                  left JOIN Payment ON  Company.ID=Payment.PayerCompanyID
                                 left JOIN PaymentDetail ON Payment.ID  = PaymentDetail.PaymentID
                          GROUP BY Company.FileAs) as innerQuery1,          
                           
                          (
                          SELECT   Company.FileAs AS Компания,    sum(Expense.TotalPC) AS СуммаРасхода
                          FROM         Company
                           
                            left JOIN Project ON Company.ID = Project.CustomerCompanyID
                            left join Expense  on Project.ID  = Expense.ProjectID
                          GROUP BY Company.FileAs) as innerQuery2
                          Цитата ^D^ima @
                          несколько не понял

                          Ну что ты всё заумь какую-то выдумываешь?

                          ExpandedWrap disabled
                            SELECT innerQuery1.Компания
                                 , innerQuery1.СуммаПрихода
                                 , innerQuery2.СуммаРасхода
                             
                            FROM (   SELECT Company.FileAs as Компания
                                          , SUM(PaymentDetail.Value) AS СуммаПрихода
                                     FROM Company
                                     JOIN Payment ON Company.ID=Payment.PayerCompanyID
                                     JOIN PaymentDetail ON Payment.ID = PaymentDetail.PaymentID
                                     GROUP BY Company.FileAs
                                 ) AS innerQuery1,
                                    
                                 (   SELECT Company.FileAs AS Компания
                                          , SUM(Expense.TotalPC) AS СуммаРасхода
                                     FROM Company
                                     JOIN Project ON Company.ID = Project.CustomerCompanyID
                                     JOIN Expense ON Project.ID = Expense.ProjectID
                                     GROUP BY Company.FileAs
                                 ) as innerQuery2
                             
                            WHERE innerQuery1.Компания = innerQuery2.Компания
                            Akina
                            теперь понятно, :thanks::thanks::thanks:
                              Опять столкнулся с трудностью:
                              ExpandedWrap disabled
                                SELECT   Company.FileAs AS Компания, ISNULL(sum(Expense.TotalPC),0) AS СуммаРасхода
                                FROM         Company
                                 
                                  left JOIN Project ON Company.ID = Project.CustomerCompanyID
                                  left join Expense  on Project.ID  = Expense.ProjectID
                                 
                                Where YEAR(Expense.Date) = YEAR( GETDATE( )) and    MONTH(Expense.Date) between 1 and MONTH(GETDATE( ))-1
                                GROUP BY Company.FileAs

                              Тут для 100 компаний формируется расход.

                              Проблема в том, что если нет расхода, то через условие Where строчка будет отброшена, т.к. нет даты.
                              А как сделать так чтобы туда попадал 0?

                              нужно что-то этого:
                              Условие Where выполняется только если Expense через Project.ID = Expense.ProjectID существует.

                              Как-то так:
                              If Record_exist(Expense) then
                              Where YEAR(Expense.Date) = YEAR( GETDATE( )) and MONTH(Expense.Date) between 1 and MONTH(GETDATE( ))-1
                              End if

                              В общем для 100 клиентов нужно сделать таблицу из 100 записей и если расхода нет, записать 0.

                              надеюсь понятно написал...
                                Цитата ^D^ima @
                                Проблема в том, что если нет расхода, то через условие Where строчка будет отброшена, т.к. нет даты.
                                А как сделать так чтобы туда попадал 0?

                                Типичная проблема ошибочной логики. Смотри.

                                Тебе надо сделать две вещи.
                                Первая - это объединить записи из Expense с соотв. записью из Company+Project.
                                Вторая - это отобрать записи из Expense, которые отвечают твоим требованиям.

                                А теперь - внимание, вопрос! Что нужно делать сначала, а что потом?

                                Ответ очевиден - сначала надо отобрать, и только потом объединять отобранное. Что делает твой запрос? да с точностью до наоборот!

                                Для того, чтобы в правильном порядке выполнить эти два действия, условие отбора, которое должно выполняться ДО связывания (или, точнее, во время связывания - какая собственно разница? лишь бы не после), следует размещать в самОй секции связывания. То есть в секции ON.

                                Правильный вопрос будет выглядеть так:

                                ExpandedWrap disabled
                                  SELECT Company.FileAs AS Компания, ISNULL(sum(Expense.TotalPC),0) AS СуммаРасхода
                                  FROM      Company
                                  LEFT JOIN Project ON Company.ID = Project.CustomerCompanyID
                                  LEFT JOIN Expense ON Project.ID  = Expense.ProjectID
                                                   AND YEAR(Expense.Date) = YEAR( GETDATE( ))
                                                   AND MONTH(Expense.Date) between 1 and MONTH(GETDATE( ))-1
                                  GROUP BY Company.FileAs


                                Добавлено
                                PS. Подумай, что ты будешь получать от этого запроса в ЯНВАРЕ...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (15) 1 2 [3] 4 5 ...  14 15 все


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