Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли обойтись 1 запросом? [D7, MSSQL]


Страницы:   1 2

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]

Ну, только знаки может поставить >= и <=
Соответственно.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо