Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Distinct в CASE / 15 сообщений из 15, страница 1 из 1
06.02.2009, 15:32
    #35802143
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
Вот такой вопрос, есть селект см.ниже, выбирает количество событий за год по месяцам, но нужно, чтобы выборка была не всех событий в месяце, а лишь количество дней с данным событием, т.е. если в дне было 4 события или 40 то считалось как 1 день в котором произошло данной событие.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
count(case when month(date_srok) =  1  then  1  else null end),
count(case when month(date_srok) =  2  then  1  else null end),
count(case when month(date_srok) =  3  then  1  else null end),
count(case when month(date_srok) =  4  then  1  else null end),
count(case when month(date_srok) =  5  then  1  else null end),
count(case when month(date_srok) =  6  then  1  else null end),
count(case when month(date_srok) =  7  then  1  else null end),
count(case when month(date_srok) =  8  then  1  else null end),
count(case when month(date_srok) =  9  then  1  else null end),
count(case when month(date_srok) =  10  then  1  else null end),
count(case when month(date_srok) =  11  then  1  else null end),
count(case when month(date_srok) =  12  then  1  else null end)
FROM table
WHERE event =  45  and year(date_srok) =  2006  

Надо в COUNT учесть distinct day(date_srok), чтобы ответ соответствовал нижнему скрипту

Код: plaintext
1.
2.
select count(distinct day(date_srok))
FROM table
where event =  45  and year(date_srok) =  2006  and month(date_srok) =  1 

Смысл вопроса в том, чтобы результат выводился в одну строку, как в первом скрипте. Заранее благодарен.
...
Рейтинг: 0 / 0
06.02.2009, 16:28
    #35802313
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
maxATC пишет:

> Надо в COUNT учесть distinct day(date_srok), чтобы ответ соответствовал
> нижнему скрипту
>
> select count(distinct day(date_srok))
> FROM table
> where event = *45* and year(date_srok) = *2006* and month(date_srok) = *1*

Так так и будет

SELECT
count( DISTINCT case when month(date_srok) = *1* then *1* else null end),
....
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.02.2009, 16:43
    #35802357
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
MasterZiv пишет,
Так так и будет

SELECT
count( DISTINCT case when month(date_srok) = *1* then *1* else null end)

Нет будет, а будет distinct по месяцу и ответ будет = 1, а нужно по day в месяце.
...
Рейтинг: 0 / 0
06.02.2009, 17:10
    #35802441
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
Поясню более подробно, раз такой ответ прислал MasterZiv .
за 1-й месяц событий 21
1 день 7 событий
2 день 11 событий
3 день 1 событие
4 день 2 события
так нужно чтобы вернуло за 1-й месяц количество дней т.е. 4 , а по первому скрипту возвращает 21, та вот как туда прилепить в COUNT этот distinct day(date_srok), чтобы вернуло 4. Возможна ли данная реализация посредством CASE?
...
Рейтинг: 0 / 0
06.02.2009, 19:08
    #35802739
sPaul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
select count(distinct date_srok)
from table
where event = 45 and year(date_srok) = 2006
group by ent, month(date_srok)

в одну строку - list()
...
Рейтинг: 0 / 0
06.02.2009, 20:06
    #35802833
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
sPaul, спасибо, что откликнулись, но не то, я просто не правильно пояснил вопрос, в одну строку но каждое значение именовано . Т.е. одна строка на год содержащая поля по месяцам с количеством дней события.
Еще раз спасибо и извиняюсь за плохую постановку вопроса.
...
Рейтинг: 0 / 0
07.02.2009, 00:19
    #35803039
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
maxATC пишет:

> Нет будет, а будет distinct по месяцу и ответ будет = 1, а нужно по day
> в месяце.
Я вам про синтаксис говорю, а вот про семантику уж вы сами думайте.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.02.2009, 00:25
    #35803048
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
maxATC пишет:
> Вот такой вопрос, есть селект см.ниже, выбирает количество событий за
> год по месяцам, но нужно, чтобы выборка была не всех событий в месяце, а
> лишь количество дней с данным событием, т.е. если в дне было 4 события

Не люблю писать запросы за других, но раз уж въехал... может вам это надо ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
   month(date_srok),
   count( distinct  1 ) -- или count(distinct day(date_srok))
FROM table
WHERE event =  45  and year(date_srok) =  2006 
group by month(date_srok)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.02.2009, 12:46
    #35803347
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
MasterZiv пишет
Я вам про синтаксис говорю, а вот про семантику уж вы сами думайте.

Синтаксис знаю, спасибо за участие, просто я спросил вот почему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT
count(case when month(date_srok) =  [b]1  then  1  else null end)[/b]
FROM table
WHERE event =  45  and year(date_srok) =  2006  
равен 
select count(*)
FROM table
where event =  45  and year(date_srok) =  2006  and month(date_srok) =  1 
-----------------------------------------------------------------------
а вот как 
select distinct day(date_srok)
FROM table
where event =  45  and year(date_srok) =  2006  and month(date_srok) =  1 
представить в виде
SELECT
count(???? case when month(date_srok) =  [b]1  then  1  else null end)[/b]
FROM table
WHERE event =  45  and year(date_srok) =  2006  
Возможно ли так? Достаточно было бы или Да или Нет.

Еще раз спасибо MasterZiv.
Тему закрыта. Всех участников и читателей благодарю :-))
...
Рейтинг: 0 / 0
08.02.2009, 00:22
    #35803946
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
maxATC пишет:

Я что-то запутался. Может вы лучше по-русски напишите, что
у вас за таблицы и что надо получить ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.02.2009, 10:57
    #35804081
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
MasterZiv,

select count( * )
FROM table
where event = 45 and year(date_srok) = 2006 and month(date_srok) = 1
равен
SELECT
count( case when month(date_srok) = 1 then 1 else null end ),
FROM table
WHERE event = 45 and year(date_srok) = 2006

так вот, мне нужно не count(*), а count(поле) но в редакции count(case when month(date_srok) = 1 then 1 else null end)
рабочий скрипт есть но выполняется в количестве event до 300 в десять раз дольше чем в реализации с CASE, хочется побыстрее, возможно ли в реализации с CASE.
Еще раз спасибо за помощь.
...
Рейтинг: 0 / 0
08.02.2009, 11:34
    #35804100
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
Да забыл пояснить, почему такой упертый на данную реализацию.
Таблица заполнения удаленная, клиент заполняет INSERTом (SELECTом). Создатель таблицы изменить что либо не в состоянии.
...
Рейтинг: 0 / 0
08.02.2009, 16:25
    #35804305
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
maxATC пишет:


Этот запрос
> select count(***)
> FROM table
> where event = 45 and year(date_srok) = 2006 and month(date_srok) = 1
> равен

лучше этого

> SELECT
> count(*case when month(date_srok) = 1 then 1 else null end*),
> FROM table
> WHERE event = 45 and year(date_srok) = 2006

тем, что он считает записи только ЯНВАРЯ, в отличие от
второго, который считает все месяцы, а "выводит" только один.

Доводя эту идею до абсурда, вы могли бы писать

SELECT
count(case when event = 45 and year(date_srok) = 2006 and month(date_srok) = 1
then 1 else null end),
FROM table

но вот только зачем ?

Ещё раз, лучше напишите словами, что вам надо.
Словами. Иначе я помочь не смогу.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.02.2009, 16:57
    #35804340
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
ну хочет человек получить значения по месяцам в 12-ти колонках, но одним запросом.
--
2 maxATC: на сколько я понял задачу, лучшая реализация - 12 подзапросов

либо построить VIEW: select distinct year(date_srok), month(date_srok), day(date_srok), event from table
либо если база поддерживает , можно сделать select from select
...
Рейтинг: 0 / 0
08.02.2009, 18:07
    #35804419
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct в CASE
MasterZiv, самый первый скрипт моей показывает, что нужно по всем месяцам, а то, что пишу про первый месяц это просто, чтобы короче, суть то не меняется, да просто вопрос в не написании скрипта как сделать, а можно ли представить один запрос в другой который содержит CASE.

Dmitry пишет
ну хочет человек получить значения по месяцам в 12-ти колонках, но одним запросом.
Совершенно правильный подход.
--
2 maxATC: на сколько я понял задачу, лучшая реализация - 12 подзапросов
именно так и сделано первоначально.


Еще раз спасибо Всем.
Тема закрыта . Благодарю MasterZiv,Dmitry.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Distinct в CASE / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]