Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Можно ли обойтись 1 запросом?   Найти похожие ветки 

 
nejest   (2004-02-10 16:24) [0]

Нужно сделать отчёт в котором выводится число людей с различным стажем, например:
Менее 1 года- 5
от 1 до 3- 2
от 3 до 5- 10
от 5 до 10- 3
.......
более 25 лет- 5

Можно ли обойтись 1 запросом или для каждой строчки придётся делать отдельный отчёт? Мне не очень хочется писать 8 практически одинаковых запросов.


 
Семен Сорокин   (2004-02-10 16:28) [1]

запускай следующий (один) запрос с необходимыми параметрами.
select count(*) from table where стаж between :y1 and :y2
или я чего-то недопонял?


 
stas   (2004-02-10 16:30) [2]

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) [3]

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


 
Stas   (2004-02-10 16:33) [4]

Короче вот так.
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),
....


 
Sandman25   (2004-02-10 16:38) [5]

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


 
Sandman25   (2004-02-10 16:40) [6]

Алиасы спутал
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


 
nejest   (2004-02-10 17:07) [7]

У меня ещё 1 вопрос: Я передаю в запрос дату на которую формируется запрос, как мне от этой даты отнять определённое число лет?


 
Семен Сорокин   (2004-02-10 17:13) [8]

nejest (10.02.04 17:07) [7]
У меня ещё 1 вопрос: Я передаю в запрос дату на которую формируется запрос, как мне от этой даты отнять определённое число лет?


DATEADD(yyyy, -MyDiff, MyDate)
-MyDiff - значение сколько отнять
MyDate - дата


 
Sandman25   (2004-02-10 17:20) [9]

[7] nejest (10.02.04 17:07)

Если есть MSDN, посмотрите его. T-SQL достаточно хорошо в нем описывается.


 
nejest   (2004-02-10 17:26) [10]

2 Семен Сорокин
попробовал и что-то не получается
DATEADD(yyyy,-1,=:p1)
как должно быть правильно? p1 это параметр с датой


 
Sandman25   (2004-02-10 17:34) [11]

= уберите.
И, кстати, если параметр, то вычитать год лучше еще на клиенте, до присвоения параметра. И никакого dateadd не понадобится.


 
Семен Сорокин   (2004-02-10 17:35) [12]

nejest (10.02.04 17:26) [10]
= убери.
примеров много в Books online (ставится вместе с MSSQL) и в MSDN.


 
nejest   (2004-02-10 17:50) [13]

2 Sandman25
>И, кстати, если параметр, то вычитать год лучше еще на клиенте, >до присвоения параметра. И никакого dateadd не понадобится.
И передавать 8 параметров? ИМХО лучше передавать 1 и пользоватся dateadd.


 
Sandman25   (2004-02-10 17:54) [14]

[13] nejest (10.02.04 17:50)

ИМХО лучше смотреть на разницу между параметром и датой.
CASE (GetDate()-StartOfWork) div 365
WHEN 0 "до года"
WHEN 1,2 "от года до трех"
...
END
Только не уверен насчет синтаксиса, я не спец по MS SQL.


 
nejest   (2004-02-11 16:48) [15]

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-11 16:51) [16]

Присвоение параметров идет 1 раз через ParamByName?
Надо 3 раза, и через Params[номер]


 
nejest   (2004-02-11 16:55) [17]

и заводить параметры p2,p3?


 
Sandman25   (2004-02-11 16:59) [18]

[17] nejest (11.02.04 16:55)

Если хотите использовать ParamByName, то имена параметров должны различаться.
Если Params[номер], то имена могут быть одинаковыми.
В любом случае присваивать нужно все параметры (сколько двоеточий, столько и параметров).


 
nejest   (2004-02-11 17:06) [19]

вот как идёт:
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 17:12) [20]

[19] nejest (11.02.04 17:06)

Неужели Вам легче спросить, чем попробовать? :)


 
nejest   (2004-02-11 17:28) [21]

а как нибудь передать его 1 раз и использовать нельзя?


 
Sandman25   (2004-02-11 17:33) [22]

Можно. Если это параметр хранимой процедуры, в которой этот параметр используется 3 раза в одном select.

Хотя, возможно, для MS SQL можно и без ХП. Через @p. Но тут уж я не помощник.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
14-43769
SergPas
2004-02-13 13:26
2004.03.14
Регистрация ПО


1-43579
Sphinx
2004-03-02 16:05
2004.03.14
Как закрять форму еще при её создании


1-43440
003
2004-02-29 23:51
2004.03.14
Rich Text Format


1-43496
Vlad40
2004-02-26 13:14
2004.03.14
Click в MonthCalendar: как идентифицировать щелчок по дню?


14-43764
BVV
2004-02-19 13:01
2004.03.14
Телефонная книга





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский