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

Модераторы: Akina
Страницы: (15) « Первая ... 10 11 [12] 13 14 ... Последняя » все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    ExpandedWrap disabled
      select fio, number
      from
      (select fio, number, row_number() over (partition by fio order by number asc) rn
      from table) x
      where rn < 3
    Сообщение отредактировано: JoeUser -
      Akina, Мощно!!!

      Как можно из этого запроса:
      ExpandedWrap disabled
        select   Employee.FileAs, project.FileAs, TaskRequest.FileAs
        ,Cast( REVERSE(substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), PatIndex('%[^0-9]%', substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), len(TaskRequest.FileAs)))-1))as int)
        ,row_number() over (partition by Employee.FileAs, project.FileAs order by Cast( REVERSE(substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), PatIndex('%[^0-9]%', substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), len(TaskRequest.FileAs)))-1))as int)  DESC) as rn
         
         
        from
        TaskRequest
        left join Project on TaskRequest.ProjectID=Project.ID
        Left join Employee on Employee.ID=TaskRequest.EmployeeID
        Left join CostCenter on CostCenter.id= Project.CostCenterID
         
        Where TaskRequest.EmployeeID is not null and TaskRequest.FileAs like N'%Отгрузка%' and TaskRequest.FileAs like N'%[%]' and year(TaskRequest.DueTime)=year(@d1)


      избавиться от записи 2-х раз одной и той-же формулы
      ExpandedWrap disabled
        Cast( REVERSE(substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), PatIndex('%[^0-9]%', substring(REVERSE(TaskRequest.FileAs)
        Ещё такой вопрос:
        Результат отчета:

        Прикреплённый файлПрикреплённый файлSQL2.png (43,54 Кбайт, скачиваний: 860)

        Как мне сделать группировку по 'сотрудник' и 'проект' и при этом найти разницу процентов?
        Может быть как одна выдача процентов группы 'сотрудник' и 'проект', так и две.

        В прошлые разы было предложено решение сделать
        ExpandedWrap disabled
          max(query1.Процент)-min(query1.Процент)
          Group by query1.Сотрудник,query1.Проект

        Но если у группы 'сотрудник' и 'проект' одна выдача, то max(query1.Процент)-min(query1.Процент) даст 0, т.к. max(query1.Процент) и min(query1.Процент) будут совпадать.

        Нужно как-то найти количество записей в группах и сделать условие что если кол-во таких групп 2 то берется max(query1.Процент)-min(query1.Процент) в противном случаи только query1.Процент
          Цитата ^D^ima @
          избавиться от записи 2-х раз одной и той-же формулы

          Ну я же уже давал ссылку на CTE...

          Цитата ^D^ima @
          если у группы 'сотрудник' и 'проект' одна выдача, то max(query1.Процент)-min(query1.Процент) даст 0, т.к. max(query1.Процент) и min(query1.Процент) будут совпадать.

          Нужно как-то найти количество записей в группах и сделать условие что если кол-во таких групп 2 то берется max(query1.Процент)-min(query1.Процент) в противном случаи только query1.Процент

          ExpandedWrap disabled
            CASE WHEN MAX(field) = MIN(field)
                 THEN MAX(field)
                 ELSE MAX(field) - MIN(field)
            END
            Цитата Akina @
            CASE WHEN MAX(field) = MIN(field)
                 THEN MAX(field)
                 ELSE MAX(field) - MIN(field)
            END

            гениально! не додумался до такой простой вещи. Уже хотел ноль везде дописывать, респектую. :thanks:
              Не пойму алгоритмически как решить задачу:
              У нас есть таблица
              ExpandedWrap disabled
                Дата, Сумма
                01.01.2018 100руб
                01.02.2018 100руб
                01.03.2018 100руб
                01.04.2018 100руб
                01.05.2018 100руб


              Мы хотим взять все суммы с даты1 по дату2, но при условии что есть запись на дату2. Т.е. если записи на дату 2 нет, то не нужно вообще ничего брать

              Select 'Сумма'
              From table1
              Where 'Дата'>=@дата1 and 'Дата'<=@дата2 and ???

              Где-то нужно case впихнуть, не пойму где

              Можно было бы в Select впихнуть, но хотелось бы что-бы вообще не было строк выдачи, да и в select неясно что писать
                ExpandedWrap disabled
                  AND SUM(CASE WHEN 'Дата'=@дата2 THEN 1 ELSE 0 END)>0
                  не заработало:
                  Цитата
                  Статистическое выражение не может использоваться в предложении WHERE, если оно не содержится во вложенном запросе предложения HAVING или в списке выбора, и столбец, подвергаемый статистической обработке, не является внешней ссылкой.


                  Добавлено
                  Но в Select такая конструкция приемлема, спасибо.
                    Цитата ^D^ima @
                    Но в Select такая конструкция приемлема, спасибо.

                    Такая конструкция либо помещается в HAVING, либо используется в коррелированном WHERE [NOT] EXISTS.
                      Спасибо. Некоторые конструкции мне тяжело переваривать :)
                        ЕслИ "ничего не брать " означает ноль, то NULL надо заменить на 0.
                        ExpandedWrap disabled
                          SELECT a.Summa * b.Cnt
                          FROM
                          (
                          Select 'Summa'
                          From table1
                          Where 'Дата'>=@дата1 and 'Дата'<=@дата2
                          ) as a
                          CROSS APPLY
                          (SELECT CASE WHEN
                           COUNT(*) >0 THEN 1 ELSE NULL END) AS Cnt
                          FROM Tabe1
                          Where 'Дата'=@дата2
                          )as b
                        Сообщение отредактировано: MIF -
                          ExpandedWrap disabled
                            Select 'Сумма' * CASE WHEN Max('Дата')=@дата2 THEN 1 ELSE 0 END
                            From table1
                            Where 'Дата'>=@дата1 and 'Дата'<=@дата2
                            Вопрос про запись данных. Никогда этим не занимался.

                            Есть такой запрос
                            ExpandedWrap disabled
                              select Company.FileAs
                              from
                              Project
                              left JOIN Company ON Company.ID = Project.CustomerCompanyID
                               
                              where ((Project. EndDate BETWEEN '01.01.2017' AND '01.01.2019')or (Project.ContractDate<'01.01.2017'and Project.State<>4)) and Company.FileAs is not null


                            нужно для всех Company.FileAs которые попали в отбор сделать следующее:
                            Взять Company.ID

                            И если в таблице DocumentCategory нет записи(таблица из 3 реквизитов)

                            DocumentClass=24,DocumentID=Company.ID,CategoryID=12 ее создать
                              Цитата ^D^ima @
                              для всех Company.FileAs которые попали в отбор сделать следующее:
                              Взять Company.ID
                              Тупо зачеркнуть в SELECT одно имя поля и вставить другое.

                              Цитата ^D^ima @
                              DocumentClass=24,DocumentID=Company.ID,CategoryID=12
                              Соответственно добавить в список выбираемых полей два INTEGER литерала.

                              Цитата ^D^ima @
                              если в таблице DocumentCategory нет записи
                              Поле DocumentID - уникальное? тогда просто вставляй. Если запись есть - будет ошибка вставки, и хрен бы с ею.
                              Иначе MERGE ... WHEN NOT MATCHED THEN INSERT
                              Сообщение отредактировано: Akina -
                                Akina
                                Как-то так? Боюсь запускать :D
                                ExpandedWrap disabled
                                  insert into  DocumentCategory(DocumentClass,DocumentID,CategoryID)
                                  select 24,Company.ID,12
                                  from
                                  Project
                                  left JOIN Company ON Company.ID = Project.CustomerCompanyID
                                   
                                   
                                  where ((Project. EndDate BETWEEN '01.01.2017' AND '01.01.2019')or (Project.ContractDate<'01.01.2017'and Project.State<>4)) and Company.FileAs is not null
                                  group by Company.id


                                Добавлено
                                Кстати как-то можно это выполнить в отладочном режиме без записи самих данных в таблицу? Т.е. чтобы просто увидеть что он на выходе захочет написать, а то каждый раз создавать тестовую базу ради 1 прогона не очень

                                Добавлено
                                Цитата Akina @
                                Поле DocumentID - уникальное?

                                А вот и нет к сожалению :(

                                Получается как-то так тогда?
                                ExpandedWrap disabled
                                  MERGE DocumentCategory
                                  USING (select 24,Company.ID,12
                                  from
                                  Project
                                  left JOIN Company ON Company.ID = Project.CustomerCompanyID
                                   
                                   
                                  where ((Project. EndDate BETWEEN '01.01.2017' AND '01.01.2019')or (Project.ContractDate<'01.01.2017'and Project.State<>4)) and Company.FileAs is not null
                                  group by Company.id)
                                  WHEN NOT MATCHED THEN INSERT VALUES(DocumentClass,DocumentID,CategoryID)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0515 ]   [ 18 queries used ]   [ Generated: 18.04.24, 05:30 GMT ]