Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.85.72] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (15) « Первая ... 10 11 [12] 13 14 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#166
,
|
|
|
select fio, number from (select fio, number, row_number() over (partition by fio order by number asc) rn from table) x where rn < 3 |
Сообщ.
#167
,
|
|
|
Akina, Мощно!!!
Как можно из этого запроса: 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-х раз одной и той-же формулы Cast( REVERSE(substring(REVERSE(TaskRequest.FileAs), PatIndex('%[0-9]%', REVERSE(TaskRequest.FileAs)), PatIndex('%[^0-9]%', substring(REVERSE(TaskRequest.FileAs) |
Сообщ.
#168
,
|
|
|
Ещё такой вопрос:
Результат отчета: Прикреплённый файлSQL2.png (43,54 Кбайт, скачиваний: 860) Как мне сделать группировку по 'сотрудник' и 'проект' и при этом найти разницу процентов? Может быть как одна выдача процентов группы 'сотрудник' и 'проект', так и две. В прошлые разы было предложено решение сделать max(query1.Процент)-min(query1.Процент) Group by query1.Сотрудник,query1.Проект Но если у группы 'сотрудник' и 'проект' одна выдача, то max(query1.Процент)-min(query1.Процент) даст 0, т.к. max(query1.Процент) и min(query1.Процент) будут совпадать. Нужно как-то найти количество записей в группах и сделать условие что если кол-во таких групп 2 то берется max(query1.Процент)-min(query1.Процент) в противном случаи только query1.Процент |
Сообщ.
#169
,
|
|
|
Цитата ^D^ima @ избавиться от записи 2-х раз одной и той-же формулы Ну я же уже давал ссылку на CTE... Цитата ^D^ima @ если у группы 'сотрудник' и 'проект' одна выдача, то max(query1.Процент)-min(query1.Процент) даст 0, т.к. max(query1.Процент) и min(query1.Процент) будут совпадать. Нужно как-то найти количество записей в группах и сделать условие что если кол-во таких групп 2 то берется max(query1.Процент)-min(query1.Процент) в противном случаи только query1.Процент CASE WHEN MAX(field) = MIN(field) THEN MAX(field) ELSE MAX(field) - MIN(field) END |
Сообщ.
#170
,
|
|
|
Цитата Akina @ CASE WHEN MAX(field) = MIN(field) THEN MAX(field) ELSE MAX(field) - MIN(field) END гениально! не додумался до такой простой вещи. Уже хотел ноль везде дописывать, респектую. |
Сообщ.
#171
,
|
|
|
Не пойму алгоритмически как решить задачу:
У нас есть таблица Дата, Сумма 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 неясно что писать |
Сообщ.
#172
,
|
|
|
AND SUM(CASE WHEN 'Дата'=@дата2 THEN 1 ELSE 0 END)>0 |
Сообщ.
#173
,
|
|
|
не заработало:
Цитата Статистическое выражение не может использоваться в предложении WHERE, если оно не содержится во вложенном запросе предложения HAVING или в списке выбора, и столбец, подвергаемый статистической обработке, не является внешней ссылкой. Добавлено Но в Select такая конструкция приемлема, спасибо. |
Сообщ.
#174
,
|
|
|
Цитата ^D^ima @ Но в Select такая конструкция приемлема, спасибо. Такая конструкция либо помещается в HAVING, либо используется в коррелированном WHERE [NOT] EXISTS. |
Сообщ.
#175
,
|
|
|
Спасибо. Некоторые конструкции мне тяжело переваривать
|
Сообщ.
#176
,
|
|
|
ЕслИ "ничего не брать " означает ноль, то NULL надо заменить на 0.
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 |
Сообщ.
#177
,
|
|
|
Select 'Сумма' * CASE WHEN Max('Дата')=@дата2 THEN 1 ELSE 0 END From table1 Where 'Дата'>=@дата1 and 'Дата'<=@дата2 |
Сообщ.
#178
,
|
|
|
Вопрос про запись данных. Никогда этим не занимался.
Есть такой запрос 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 ее создать |
Сообщ.
#179
,
|
|
|
Цитата ^D^ima @ Тупо зачеркнуть в SELECT одно имя поля и вставить другое.для всех Company.FileAs которые попали в отбор сделать следующее: Взять Company.ID Цитата ^D^ima @ Соответственно добавить в список выбираемых полей два INTEGER литерала.DocumentClass=24,DocumentID=Company.ID,CategoryID=12 Цитата ^D^ima @ Поле DocumentID - уникальное? тогда просто вставляй. Если запись есть - будет ошибка вставки, и хрен бы с ею.если в таблице DocumentCategory нет записи Иначе MERGE ... WHEN NOT MATCHED THEN INSERT |
Сообщ.
#180
,
|
|
|
Akina
Как-то так? Боюсь запускать 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 - уникальное? А вот и нет к сожалению Получается как-то так тогда? 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) |