![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли обойтись 1 запросом? [D7, MSSQL]
nejest © (2004-02-10 16:24:00)
Нужно сделать отчёт в котором выводится число людей с различным стажем, например:
Менее 1 года- 5
от 1 до 3- 2
от 3 до 5- 10
от 5 до 10- 3
.......
более 25 лет- 5
Можно ли обойтись 1 запросом или для каждой строчки придётся делать отдельный отчёт? Мне не очень хочется писать 8 практически одинаковых запросов.
Sandman25 (2004-02-11 17:33:00) [1]
Можно. Если это параметр хранимой процедуры, в которой этот параметр используется 3 раза в одном select.
Хотя, возможно, для MS SQL можно и без ХП. Через @p. Но тут уж я не помощник.
nejest (2004-02-11 17:28:00) [2]
а как нибудь передать его 1 раз и использовать нельзя?
Sandman25 (2004-02-11 17:12:00) [3]
[19] nejest (11.02.04 17:06)
Неужели Вам легче спросить, чем попробовать? :)
nejest (2004-02-11 17:06:00) [4]
вот как идёт:
form1.ADODataSet1.Parameters[0].Value:=Form1.MonthCalendar1.Date;
т.е. нужно добавить
form1.ADODataSet1.Parameters[1].Value:=Form1.MonthCalendar1.Date;
form1.ADODataSet1.Parameters[1].Value:=Form1.MonthCalendar1.Date;
и в запросе добавить p2 и p3?
Sandman25 (2004-02-11 16:59:00) [5]
[17] nejest (11.02.04 16:55)
Если хотите использовать ParamByName, то имена параметров должны различаться.
Если Params[номер], то имена могут быть одинаковыми.
В любом случае присваивать нужно все параметры (сколько двоеточий, столько и параметров).
nejest (2004-02-11 16:55:00) [6]
и заводить параметры p2,p3?
Sandman25 (2004-02-11 16:51:00) [7]
Присвоение параметров идет 1 раз через ParamByName?
Надо 3 раза, и через Params[номер]
nejest (2004-02-11 16:48:00) [8]
select COUNT(*) from pWorker pw, pWorkerAdd pwAdd where pw. id=pwAdd.WorkerId and pwAdd.SeniorityBr>DATEADD(yyyy,-1,:p1) union select COUNT(*) from pWorker pw, pWorkerAdd pwAdd where (pw.id=pwAdd.WorkerId and pwAdd.SeniorityBr<=DATEADD(yyyy,-1,:p1)) and pwAdd.SeniorityBr>DATEADD(yyyy,-3,:p1);
работает только первая часть запроса, не могу понять в чём ошибка
Sandman25 (2004-02-10 17:54:00) [9]
[13] nejest (10.02.04 17:50)
ИМХО лучше смотреть на разницу между параметром и датой.
CASE (GetDate()-StartOfWork) div 365
WHEN 0 "до года"
WHEN 1,2 "от года до трех"
...
END
Только не уверен насчет синтаксиса, я не спец по MS SQL.
nejest (2004-02-10 17:50:00) [10]
2 Sandman25
>И, кстати, если параметр, то вычитать год лучше еще на клиенте, >до присвоения параметра. И никакого dateadd не понадобится.
И передавать 8 параметров? ИМХО лучше передавать 1 и пользоватся dateadd.
Семен Сорокин (2004-02-10 17:35:00) [11]
nejest (10.02.04 17:26) [10]
= убери.
примеров много в Books online (ставится вместе с MSSQL) и в MSDN.
Sandman25 (2004-02-10 17:34:00) [12]
= уберите.
И, кстати, если параметр, то вычитать год лучше еще на клиенте, до присвоения параметра. И никакого dateadd не понадобится.
nejest (2004-02-10 17:26:00) [13]
2 Семен Сорокин
попробовал и что-то не получается
DATEADD(yyyy,-1,=:p1)
как должно быть правильно? p1 это параметр с датой
Sandman25 (2004-02-10 17:20:00) [14]
[7] nejest (10.02.04 17:07)
Если есть MSDN, посмотрите его. T-SQL достаточно хорошо в нем описывается.
Семен Сорокин (2004-02-10 17:13:00) [15]
nejest (10.02.04 17:07) [7]
У меня ещё 1 вопрос: Я передаю в запрос дату на которую формируется запрос, как мне от этой даты отнять определённое число лет?
DATEADD(yyyy, -MyDiff, MyDate)
-MyDiff - значение сколько отнять
MyDate - дата
nejest (2004-02-10 17:07:00) [16]
У меня ещё 1 вопрос: Я передаю в запрос дату на которую формируется запрос, как мне от этой даты отнять определённое число лет?
Sandman25 (2004-02-10 16:40:00) [17]
Алиасы спутал
select b.stage, count(*)
from
(select t.id, min(b.stage) stage,
from
(select 1 stage
union select 3
union select 5
union select 10
union select 25
union select 1000
) a,
table t
where a.stage > t.stage
group by t.id
) b
group by b.stage
Sandman25 (2004-02-10 16:38:00) [18]
select a.stage, count(*)
from
(select t.id, min(a.stage),
from
(select 1 stage
union select 3
union select 5
union select 10
union select 25
union select 1000
) a,
table t
where a.stage > t.stage
group by t.id
) q
group by a.stage
Stas (2004-02-10 16:33:00) [19]
Короче вот так.
Select
POLE1=sum(CASE when STAGE=>1 and STAGE<=3 then 1 else 0),
POLE2=sum(CASE when STAGE=>3 and STAGE<=5 then 1 else 0),
....
Stas (2004-02-10 16:32:00) [20]
Ну, только знаки может поставить >= и <=
Соответственно.