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

Модераторы: Pr0[)!9Y, Akina, JoeUser
Страницы: (9) « Первая ... 6 7 [8] 9  все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    MIF
    Может быть, только это не аксесс
    "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
      Попробуй format(fileas, ‘N’, ,’en-US’)
      Сообщение отредактировано: MIF -
      Мои религиозные убеждения не позволяют мне комментировать код.
      Моё мировоззренье таково: в программе комментария ни одного!
        Помогите с идеологией:
        1 Есть проект, у него 2 записи о времени
        2 У этого проекта 1 счет

        если я делаю это 1 запросом
        Проект
        левое соединение записи о времени
        левое соединение счет

        То на выходе получаю 2 строки
        ExpandedWrap disabled
          Проект1,Запись о времени1, Счет1
          Проект1,Запись о времени2, Счет1


        далее если я усложняю, ищу по счету платы, у плат суммы, потом суммирую и т.д. то в результирующей таблице суммы все в 2 раза выше, т.к. изначально 2 строчки было. Как бы мне сделать так 1 запросом чтобы на выходе изначально было:
        ExpandedWrap disabled
          Проект1,Запись о времени1, Счет1
          Проект1,Запись о времени2, null


        Или мне делать 2 подзапроса и соединять по Проекту?
        "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
          Цитата ^D^ima @
          на выходе получаю 2 строки

          Проект1Запись о времени1Счет1
          Проект1Запись о времени2Счет1

          надо использовать 2 копии таблицы времён и получать выборку
          Проект1Запись о времени1Запись о времени2Счет1
          Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
          Есть претензии ко мне как к участнику? да ради бога.
          Не нравятся мои ответы? не читайте их.
          В общем, берегите себя. Нервные клетки не восстанавливаются.
            Akina
            А если их будет не 2 а 10 к примеру?
            И как мне соединить как ты показал?
            "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
              Цитата ^D^ima @
              А если их будет не 2 а 10 к примеру?

              Давай опять отбросим "а если" и будем обсуждать конкретную структуру данных с конкретным наполнением и конкретным желаемым результатом.

              Да, про вывод типа

              Проект1Запись о времени1Счет1
              Проект1Запись о времени2Null

              лучше сразу забыть. Просто потому что возникает вполне логичный вопрос - а почему не

              Проект1Запись о времени1Null
              Проект1Запись о времени2Счет1
              Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
              Есть претензии ко мне как к участнику? да ради бога.
              Не нравятся мои ответы? не читайте их.
              В общем, берегите себя. Нервные клетки не восстанавливаются.
                Цитата Akina @
                Давай опять отбросим "а если" и будем обсуждать конкретную структуру данных с конкретным наполнением и конкретным желаемым результатом.

                Структура данных. По мере подключения через левое соединение:
                1 "Проект".
                2 "Записи о времени". Может быть несколько в проекте
                3 "Счет". Может быть несколько в проекте
                4 "Оплата". Может быть несколько по 1 счету.

                Вот и получается:
                ExpandedWrap disabled
                  SELECT  Project.ID as 'ИД проекта', Project.FileAs as Проект, (TimeEntry.Duration) AS Время,Invoice.FileAs as 'счет', Invoice.ID as 'ИД счета' , PaymentDetail.ID as 'ИД платежа', PaymentDetail.Value as 'сумма платежа'
                   
                  FROM       Project
                             left JOIN      TimeEntry on  TimeEntry.ProjectID=Project.ID
                             left JOIN Invoice ON   Project.ID = Invoice.ProjectID
                             left JOIN PaymentDetail ON PaymentDetail.InvoiceID = Invoice.ID
                   
                  WHERE  TimeEntry.StartTime >=@d1 and  TimeEntry.StartTime< @d2 and Project.FileAs='разблокировка счетов ООО Лети с нами, ООО мой билет'

                1 проект - 2 записи о времени - 1 счет - 2 платежа по счету.
                Если суммировать столбец сумма платежа по счету он покажет неверную, задвоенную сумму
                Прикреплённый файлПрикреплённый файлsql.png (11,43 Кбайт, скачиваний: 12)
                "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                  Цитата ^D^ima @
                  Структура данных. По мере подключения через левое соединение:
                  1 "Проект".
                  2 "Записи о времени". Может быть несколько в проекте
                  3 "Счет". Может быть несколько в проекте
                  4 "Оплата". Может быть несколько по 1 счету.

                  Я не понимаю одного - какая связь между каждым из нескольких времён и каждым из нескольких счетов. Точнее, я не понимаю, как между ними какая-то связь вообще может быть...
                  Но ты хочешь получить и время, и сумму по каждому счёту в одном наборе данных - значит, связь есть?
                  Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                  Есть претензии ко мне как к участнику? да ради бога.
                  Не нравятся мои ответы? не читайте их.
                  В общем, берегите себя. Нервные клетки не восстанавливаются.
                    Нужно чтобы на выходе была 1 строка с суммой времени было 60, а суммой суммы 80000
                    "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                      Цитата ^D^ima @
                      Нужно чтобы на выходе была 1 строка с суммой времени было 60, а суммой суммы 80000

                      Т.е. отдельно суммировать время, отдельно деньги...

                      А теперь повторяю, но с акцентами:

                      Т.е. отдельно суммировать время, отдельно деньги.

                      Всё понимаешь? если нет, перевожу: в одном подзапросе суммировать деньги, во втором время, а потом связать их и получить итог.
                      Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                      Есть претензии ко мне как к участнику? да ради бога.
                      Не нравятся мои ответы? не читайте их.
                      В общем, берегите себя. Нервные клетки не восстанавливаются.
                        Цитата Akina @
                        Я не понимаю одного - какая связь между каждым из нескольких времён и каждым из нескольких счетов. Точнее, я не понимаю, как между ними какая-то связь вообще может быть...

                        У меня задача получить отчет по проектам, затраченному времени и полученным деньгам за проект.
                        Вот и получается что нужно суммировать все время потраченное сотрудникам по проекту и все полученные деньги. Как ещё объяснить?

                        Я раньше делал через 3 запроса делал(Помогите с запросом (сообщение #3753073) ) потом по твоему совету в 1 соединил. Я могу обратно сделать несколько запросов, только проблема в периоде для отчета.
                        Требуется взять "записи о времени" за определенный период и из них уже найти проект и все остальное. Я не знаю по какому условию соединить подзапросы. Могут быть варианты когда у проекта нет поступлений или нет записей о времени
                        "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                          Цитата ^D^ima @
                          Я не знаю по какому условию соединить подзапросы. Могут быть варианты когда у проекта нет поступлений или нет записей о времени

                          Ну у тебя же MS SQL, который прекрасно умеет и FULL OUTER JOIN, и CROSS APPLY. Да и оконные функции у него есть, так что можно запросто использовать что-то вроде
                          ExpandedWrap disabled
                            SELECT SUM(payments.payment) OVER (PARTITION BY project.id) AS total_payment
                          Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                          Есть претензии ко мне как к участнику? да ради бога.
                          Не нравятся мои ответы? не читайте их.
                          В общем, берегите себя. Нервные клетки не восстанавливаются.
                            А как из этого рисунка( http://forum.sources.ru/index.php?act=Atta...attach_id=57837 ) получить
                            Количество уникальных ИД платежа? Count как понимаю возвращает 4, а нужно 2
                            "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                              Count(distinct(ид платежа))
                              Сообщение отредактировано: MIF -
                              Мои религиозные убеждения не позволяют мне комментировать код.
                              Моё мировоззренье таково: в программе комментария ни одного!
                                почему такая конструкция не прокатывает:
                                ExpandedWrap disabled
                                  (CASE WHEN  count(distinct TimeEntry.id)<>0
                                                       THEN count(distinct TimeEntry.id)
                                                       ELSE 1 END)


                                Добавлено
                                Я просто хочу в select'е исключить случаи когда count(distinct TimeEntry.id) равно 0. И если оно равно, ставить 1

                                Добавлено
                                Вот так помоему тоже не прокатывает, если в запросе при левом соединении нет PaymentDetail.id, говорит деление на ноль:
                                ExpandedWrap disabled
                                  count(distinct (case when PaymentDetail.id > 0 then PaymentDetail.id end) )


                                Добавлено
                                семен-семеныч:
                                ExpandedWrap disabled
                                   count(distinct (isnull (PaymentDetail.id,1) ) )

                                :facepalm: :facepalm: :facepalm:

                                Добавлено
                                Что-то монструозное получилось, но вродебы как рабочее.
                                так не понял как делать:
                                Цитата Akina @
                                Т.е. отдельно суммировать время, отдельно деньги.


                                сделал в 1 запросе:
                                ExpandedWrap disabled
                                  use PJM10
                                  declare @d1 date
                                  declare @d2 date
                                  set @d1='01.01.2017'
                                  set @d2=GETDATE()+1
                                   
                                   
                                   
                                  SELECT  Project.FileAs as Проект, Employee.FileAs as "руководитель проекта",isnull(Division.FileAs,'') as Практика ,
                                   
                                   isnull(sum( PaymentDetail.Value)/count(distinct (isnull (TimeEntry.id,1) ) )  ,0 )AS Сумма,
                                   isnull(CostCenter.FileAs,'')as [Центр затрат],
                                   
                                   round( CAST(SUM(TimeEntry.Duration)/ count(distinct (isnull (PaymentDetail.id,1) ) ) AS FLOAT)/60,2) AS Время,
                                   
                                   round(CAST(SUM(CASE WHEN TimeEntry.EmployeeID<>Project.ProjectManagerEmployeeID
                                                       THEN TimeEntry.Duration
                                                       ELSE 0 END) / count(distinct (isnull (PaymentDetail.id,1) ) ) AS FLOAT)/60,2) AS "Время не руководителя",
                                  round(CAST(SUM(CASE WHEN TimeEntry.DivisionID = 7 THEN TimeEntry.Duration
                                                       ELSE 0 END)/ count(distinct (isnull (PaymentDetail.id,1) ) )  AS FLOAT)/60,2) AS "Время курьеров"
                                  ,round( sum(PaymentDetail.Value) / (CAST(SUM(TimeEntry.Duration) AS FLOAT)/60) , 2) as "Стоимость часа 5\2"
                                   
                                  FROM         TimeEntry
                                               left JOIN  Project on TimeEntry.ProjectID=Project.ID
                                               left JOIN Invoice ON   Project.ID = Invoice.ProjectID
                                               left JOIN PaymentDetail ON PaymentDetail.InvoiceID = Invoice.ID
                                               left JOIN Payment ON PaymentDetail.PaymentID = Payment.ID and (Payment.FileAs NOT LIKE N'%-1%') AND (Payment.FileAs NOT LIKE N'%-3%')
                                               left JOIN Employee on Project.ProjectManagerEmployeeID=Employee.ID
                                               left JOIN Division on Employee.DivisionID=Division.ID
                                               left JOIN CostCenter on Project.CostCenterID=CostCenter.ID
                                  WHERE  TimeEntry.StartTime >=@d1 and  TimeEntry.StartTime< @d2 --and Project.FileAs='Ликвидация ООО "Метека"'
                                  group by  Project.FileAs, Employee.FileAs, Division.FileAs , CostCenter.FileAs
                                  Order by Практика, [руководитель проекта]
                                "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1509 ]   [ 17 queries used ]   [ Generated: 21.02.18, 11:00 GMT ]