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

Модераторы: Akina
Страницы: (15) « Первая ... 2 3 [4] 5 6 ...  14 15 все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Цитата Akina @
    следует размещать в самОй секции связывания. То есть в секции ON.

    Гениально!!!

    Цитата Akina @
    Подумай, что ты будешь получать от этого запроса в ЯНВАРЕ...

    Да, вижу...

    Цитата Akina @
    Ответ очевиден - сначала надо отобрать, и только потом объединять отобранное.

    :yes:

    Akina, спасибо за ответы :thanks:
      Все более тяжелые отчеты просят от меня :rolleyes:

      Подскажите концептуально:
      Есть 3 отдельных запроса, в каждом из которых результатом является 1 строка, 2 числа: СуммаПриход, СуммаРасход
      Как мне получить отчет, где будет:
      НазваниеЗапроса(произвольное название), СуммаПриход, СуммаРасход
        ExpandedWrap disabled
              SELECT 'Запрос 1' AS НазваниеЗапроса, СуммаПриход, СуммаРасход
              FROM [query1]
          UNION ALL
              SELECT 'Запрос 2'                   , СуммаПриход, СуммаРасход
              FROM [query2]
          UNION ALL
              SELECT 'Запрос 3'                   , СуммаПриход, СуммаРасход
              FROM [query3]
          Как-то можно оптимизировать это?
          ExpandedWrap disabled
            Select 'Выручка консультантов' as Вид, СуммаПриход, СуммаРасход
            from (
            Select sum(PaymentDetail.Value) AS СуммаПриход, СуммаРасход = 0
            From    Payment
                   left JOIN PaymentDetail ON Payment.ID  = PaymentDetail.PaymentID
             
            where (Payment.FileAs not LIKE N'%-1%') and YEAR(Payment.Date) = YEAR( GETDATE( )) and    MONTH(Payment.Date) between 1 and MONTH(GETDATE( ))-1
            ) as запрос1
             
             
            Union all
             
            Select 'Проектные расходы' , Запрос2.СуммаПриход, Запрос3.СуммаРасход
            from (
            Select sum(PaymentDetail.Value) AS СуммаПриход
            From    Payment
                   left JOIN PaymentDetail ON Payment.ID  = PaymentDetail.PaymentID
             
            where (Payment.FileAs LIKE N'%-1%') and YEAR(Payment.Date) = YEAR( GETDATE( )) and    MONTH(Payment.Date) between 1 and MONTH(GETDATE( ))-1
            ) as Запрос2,
            (
            Select sum(Expense.TotalPC) AS СуммаРасход
            From    Expense
                  
            where Expense.EmployeeID=1386 and YEAR(Expense.Date) = YEAR( GETDATE( )) and    MONTH(Expense.Date) between 1 and MONTH(GETDATE( ))-1
            ) as Запрос3
             
             
            Union all
             
            Select 'РКО\ПКО' , Запрос4.СуммаПриход, Запрос5.СуммаРасход
            from (
            select sum(ExpenditureEntry.Total) AS СуммаПриход
            from ExpenditureEntry
            where (ExpenditureEntry.ExpenditureTypeID = 1 or ExpenditureEntry.ExpenditureTypeID =5 or ExpenditureEntry.ExpenditureTypeID =6 or ExpenditureEntry.ExpenditureTypeID =7) and ExpenditureEntry.CostCenterID = 20/*РКО*/
            and YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date) between 1 and MONTH(GETDATE( ))-1
               ) as Запрос4,
             
            (select sum(ExpenditureEntry.Total) AS СуммаРасход
            from ExpenditureEntry
            where ExpenditureEntry.CostCenterID = 21 /*ПКО*/ and YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date) between 1 and MONTH(GETDATE( ))-1
               ) as Запрос5


          например хочется условие по времени вынести куда-то(функция\процедура) и туда передовать дату. Возможно что-то ещё я сделал
            1) UNION ALL не оптимизируется. Можно оптимизировать только отдельные его подзапросы.
            2) Подзапросы независимы, так что параметры нужно передавать в каждый из них.
            3) Если хочется передавать параметр один раз - его можно передать через локальную переменную либо создать хранимую процедуру с параметрами.
            4) Объединить условия в подзапросах не получится - подзапросы независимы. Да и нет в том смысла (см. п. 1).
              В sqlcmd можно делать переменные, можно ли их потом использовать для всех запросов?
              например я использую везде between '01.08.2017' and '31.08.2017 23:59' и можно ли сделать 2 переменные для начальной даты и конечной даты и их распространить на все запросы?
                Цитата ^D^ima @
                between '01.08.2017' and '31.08.2017 23:59'

                Не знаю, какую БД ты используешь. В MS SQL в условии есть баг. Запись, созданная в 23:59:59.100 в результат не попадет. Лучше использовать ...>= '01.08.2017' and ...<'01.09.2017'
                  MIF
                  MS SQL. Спасибо за совет
                    Цитата Akina @
                    1) UNION ALL не оптимизируется. Можно оптимизировать только отдельные его подзапросы.

                    Как можно сделать итог суммаприхода, суммарасхода и разница между ними как на картинке?
                    Прикреплённый файлПрикреплённый файлsql.png (7,26 Кбайт, скачиваний: 823)
                      Цитата ^D^ima @
                      Как можно сделать итог

                      WITH ROLLUP

                      Цитата ^D^ima @
                      и разница между ними

                      Ну это уже пусть клиентская часть попыхтит...
                        Цитата Akina @
                        WITH ROLLUP

                        У меня 4 строки - 4 отдельных запроса, объединенных UNION ALL и в какой секции WITH ROLLUP нужно использовать?

                        Добавлено
                        ExpandedWrap disabled
                          use PJM10
                          Select QUOTENAME('Выручка консультантов','"') as Вид, СуммаПриход, СуммаРасход
                          from (
                          Select sum(PaymentDetail.Value) AS СуммаПриход, СуммаРасход = 0
                          From    Payment
                                 left JOIN PaymentDetail ON Payment.ID  = PaymentDetail.PaymentID
                           
                          where (Payment.FileAs not LIKE N'%-1%') and Payment.PaymentTypeID = 2 and (YEAR(Payment.Date) = YEAR( GETDATE( )) and    MONTH(Payment.Date)=MONTH(GETDATE( ))-1)
                          ) as запрос1
                           
                           
                          Union all
                           
                          Select QUOTENAME('Проектные расходы','"') ,Запрос2.СуммаПриход, Запрос3.СуммаРасход
                          from (
                          Select sum(PaymentDetail.Value) AS СуммаПриход
                          From    Payment
                                 left JOIN PaymentDetail ON Payment.ID  = PaymentDetail.PaymentID
                           
                          where (Payment.FileAs LIKE N'%-1%') and Payment.PaymentTypeID = 2 and (YEAR(Payment.Date) = YEAR( GETDATE( )) and    MONTH(Payment.Date)=MONTH(GETDATE( ))-1)
                          ) as Запрос2,
                          (
                          Select sum(Expense.TotalPC) AS СуммаРасход
                          From    Expense
                                
                          where Expense.EmployeeID=1386 and (YEAR(Expense.Date) = YEAR( GETDATE( )) and    MONTH(Expense.Date)=9)
                          ) as Запрос3
                           
                           
                          Union all
                           
                          Select QUOTENAME('Расходы иное','"') ,СуммаПриход=0 , Запрос5.СуммаРасход
                          from
                          (select sum(ExpenditureEntry.Total) AS СуммаРасход
                          from ExpenditureEntry
                          where (ExpenditureEntry.ExpenditureTypeID = 1 or ExpenditureEntry.ExpenditureTypeID =6 or ExpenditureEntry.ExpenditureTypeID =7) and ExpenditureEntry.CostCenterID = 20/*РКО*/
                          and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1)
                            ) as Запрос5
                            
                           
                          Union all
                           
                          Select QUOTENAME('Касса РО','"') ,Запрос6.СуммаПриход , Запрос7.СуммаРасход
                          from (
                          select sum(ExpenditureEntry.Total) AS СуммаПриход
                          from ExpenditureEntry
                          where ExpenditureEntry.CostCenterID = 21 /*ПКО*/ and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1 )
                            
                           ) as Запрос6,
                           
                          (select sum(ExpenditureEntry.Total) AS СуммаРасход
                          from ExpenditureEntry
                          where ExpenditureEntry.ExpenditureTypeID =5  and ExpenditureEntry.CostCenterID = 20/*РКО*/
                          and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1)
                            ) as Запрос7


                        Добавлено
                        Цитата ^D^ima @
                        WITH ROLLUP

                        и ещё как понимаю ROLLUP покажет подитоги для разных столбцов "вид", т.е. вместо 5 строки он добавит ещё 5(4 было + 4 подитого + 1 общий итог)
                          Цитата ^D^ima @
                          У меня 4 строки - 4 отдельных запроса, объединенных UNION ALL и в какой секции WITH ROLLUP нужно использовать?

                          Обернуть всё это внешним запросом, добавить группировку по полю "Вид" и обернуть в SUM() остальные поля.
                            Akina
                            :wacko: :wacko: :wacko:
                            спасибо
                              Цитата Akina @
                              Обернуть всё это внешним запросом

                              А в поле select что писать, если там через union 3 отдельных запроса сделаны?
                                Цитата ^D^ima @
                                А в поле select что писать
                                :wall:
                                ExpandedWrap disabled
                                  SELECT Вид, SUM(СуммаПриход) СуммаПриход, SUM(СуммаРасход) СуммаРасход
                                  FROM (твой запрос с 4 подзапросами и 3 UNION-ами) dummy
                                  GROUP BY Вид WITH ROLLUP
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (15) « Первая ... 2 3 [4] 5 6 ...  14 15 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0433 ]   [ 18 queries used ]   [ Generated: 24.04.24, 02:33 GMT ]