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

Вниз

Помогите с запросом, уже всю баку сломал   Найти похожие ветки 

 
Ega23 ©   (2007-11-01 12:33) [0]

Дано:
Таблица

Col1  Col2  Col3
---------------
30     30     3
20     30     4
60     30     4
30     20     3
20     20     4
60     20     4


Входные параметры выборки: Col2=30, Col1=20

Нужно получить:
выборку где Col2=30, при этом выборка должна быть такого рода:

Col3  Fl
3      0
4      1


т.е. Col3 берётся как distinct, при этом значение Fl=0 - если для записей с Col3 нет значений с Col1=20, Fl=1 - если такие есть.


 
b z   (2007-11-01 12:50) [1]

SQL 2005?


 
stone ©   (2007-11-01 12:50) [2]

select distinct t1.col3 , Fl = case when t2.Col3 is null then 0 else 1 end
from Table t1
left join (select col3 from Table where Col1=20) t2 on t1.Col3 = t2.Col3
where t1.Col2=30


 
Правильный_Вася   (2007-11-01 12:53) [3]

чево сломал?


 
Anatoly Podgoretsky ©   (2007-11-01 13:15) [4]

Береги честь с молоду, а голову всегда.


 
Кщд ©   (2007-11-01 13:31) [5]


> Ega23 ©   (01.11.07 12:33)

просто интересно, отчего на MS не сработает:

with temp_tbl as
(
select 30 col1, 30 col2, 3 col3 from dual
union all
select 20 col1, 30 col2, 4 col3 from dual
union all
select 60 col1, 30 col2, 4 col3 from dual
union all
select 30 col1, 20 col2, 3 col3 from dual
union all
select 20 col1, 20 col2, 4 col3 from dual
union all
select 60 col1, 20 col2, 4 col3 from dual
)
select col3, count(case when col1 = 20 then 1 else null end)/decode(count(case when col1 = 20 then 1 else null end), 0, 1, count(case when col1 = 20 then 1 else null end))
from temp_tbl
where col2=30
group by col3


конечно, decode заменить на аналог


 
Ega23 ©   (2007-11-01 13:33) [6]

select col3,
      sum(distinct case when col1 = 20 then 1 else 0 end) as Fl
 from t
where col2 = 30
group by col3


 
sniknik ©   (2007-11-01 13:47) [7]

Ega23 ©   (01.11.07 13:33) [6]
а если  условие col2 = 30 "обрежет" часть вариантов? или у тебя в таблице только те данные что показаны и других быть не может?

имхо, так логичнее. универсальнее. лучше в конце концов. :)
select col3, sum(case when col1 = 20 then 1 else Null end) as Fl
from t
group by col3


distinct тоже не особо нужен, тк по нему строится индекс и тд, для отбора уникальных... вместо просто работы с числом.


 
sniknik ©   (2007-11-01 13:48) [8]

упс. вместо sum поставь avg


 
Ega23 ©   (2007-11-01 14:01) [9]


> а если  условие col2 = 30 "обрежет" часть вариантов? или
> у тебя в таблице только те данные что показаны и других
> быть не может?


не, не обрежет, уже проверил на разных выборках. Всё равботает.


 
sniknik ©   (2007-11-01 14:11) [10]

> уже проверил на разных выборках.
проверь на этом
Col1  Col2  Col3
---------------
30     20     3
20     20     4
60     20     4
30     20     3
20     20     4
60     20     4

оно под условие в [0] тоже подходит. уверен что у тебя такого
(или частично, так например )
Col1  Col2  Col3
---------------
30     30     3
20     20     4
60     30     4
30     30     3
20     20     4
60     20     4

не будет? смысл рисковать получить неверные данные, если есть нормальный запрос которые еще и отработает быстрее...


 
Ega23 ©   (2007-11-01 14:44) [11]


> не будет? смысл рисковать получить неверные данные, если
> есть нормальный запрос которые еще и отработает быстрее.
> ..
>


Уверен. Фактически, сочетание трё столбцов - составной первичный ключ (хотя первичный ключ там отдельный счётчик).


 
Ega23 ©   (2007-11-01 14:49) [12]

Кстати, Коль, твой вариант некорректно работает


select col3, avg(case when col1 = 20 then 1 else 0 end) as Fl
from t
where Col2=30
group by col3

выборка -
col3           Fl          
----------- -----------
3           0
4           0

А должно быть
col3           Fl          
----------- -----------
3           0
4           1
т.к. для всех значений Col2=30 и col3=4 есть одно значение Col1=20


 
sniknik ©   (2007-11-01 14:54) [13]

> Кстати, Коль, твой вариант некорректно работает
это не мой вариант, см. внимательнее, мой в [7] (именно в нем надо было avg вместо sum менять)

> А должно быть
ну, уж если соответствовать до последнего символа то avg еще и в isNull(avg(...), 0) нужно "завернуть".


 
Ega23 ©   (2007-11-01 14:56) [14]

Я обернул, и sum на avg заменил
Warning: Null value is eliminated by an aggregate or other SET operation.


 
sniknik ©   (2007-11-01 14:59) [15]

> Warning: Null value is eliminated by an aggregate or other SET operation.
на то и расчет, что null в агрегатах игнорируется. все правильно.


 
Ega23 ©   (2007-11-01 15:01) [16]

Кста. А это нормально такие уорнинги на клиент получать?


 
sniknik ©   (2007-11-01 15:04) [17]

смотри не на предупреждение, а на возвращаемые данные. (предупреждения на клиенте не будет... вернее, специально нужно будет постараться чтобы его получить)


 
Ega23 ©   (2007-11-01 15:06) [18]

Слушай, а тогда как вообще QA работает? Не через ADO?
Неужели напрямую через OLEDB???


 
Anatoly Podgoretsky ©   (2007-11-01 15:12) [19]

> Ega23  (01.11.2007 15:06:18)  [18]

QA вроде работает через ODBC


 
sniknik ©   (2007-11-01 15:32) [20]

> Слушай, а тогда как вообще QA работает?
у меня подозрение что там дикая смесь... т.е. то что было написано, старое,  с ODBC, то так и работает. то что новее то с другим. ADO там тоже точно есть (когдато смотрел импортируемые функции)

зачем тебе это? или всетаки хочеш этот варнинг получать? это возможно и через ADO (может она через него это и делает), но зачем он на клиенте нужен, лишний трафик на пустые для него сообщения.
или у тебя программа сама типа QA где варнинги нужны?


 
Ega23 ©   (2007-11-01 15:43) [21]


> зачем тебе это?


Просто интересно стало


> или всетаки хочеш этот варнинг получать?


Боже упаси!

:)


 
ЮЮ ©   (2007-11-02 03:37) [22]

> уже всю баку сломал


> Col3 берётся как distinct, при этом значение Fl=0 - если
> для записей с Col3 нет значений с Col1=20, Fl=1 - если такие
> есть.


МS SQL позволяет делать точно согласно описанию:

SELECT
 c3c2.Col3,
 CASE WHEN c3c1.Cnt IS NULL THEN 0 ELSE 1 END F1
 /* значение Fl=0 - если для записей с Col3 нет значений с Col1=20, Fl=1 - если такие есть */
FROM
 (SELECT DISTINCT Col3 FROM t WHERE col2 = @Col2) c3c2
 /* Col3 берётся как distinct */
 LEFT JOIN (SELECT Col3, COUNT(*) Cnt FROM t WHERE col2 = @Col2 and col1 = @Col1 GROUP BY Col3) c3c1 ON
            /* записи с Col3 и значениями с Col1=20*/
   c3c2.Col3 = c3c1.Col3  


 
manevil   (2007-11-10 10:51) [23]

Anatoly Podgoretsky ©   (06.11.07 19:17) [18]
> webpauk  (06.11.2007 12:23:04)  [4]

Понятие "вроде бы" не должно существовать в лексике программиста, иначе это далеко заведет.


>Anatoly Podgoretsky ©   (06.11.07 19:17) [18]
> webpauk  (06.11.2007 12:23:04)  [4]

>Понятие "вроде бы" не должно существовать в лексике программиста, иначе это далеко заведет.
> Anatoly Podgoretsky ©   (01.11.07 15:12) [19]
> > Ega23  (01.11.2007 15:06:18)  [18]
>
> QA вроде работает через ODBC

И как далеко вас уже завело?


 
Anatoly Podgoretsky ©   (2007-11-10 12:17) [24]

> manevil  (10.11.2007 10:51:23)  [23]

Нам бы теперь выбраться оттуда.



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

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

Наверх





Память: 0.5 MB
Время: 0.048 c
15-1203342468
Andrewtitoff
2008-02-18 16:47
2008.03.30
Почему Application.Terminate у меня не работает? =(((


2-1204027484
Эрни
2008-02-26 15:04
2008.03.30
найти каталог


4-1182542553
Bora_ru
2007-06-23 00:02
2008.03.30
хендл окна по неполному названию


2-1204138273
Рустам
2008-02-27 21:51
2008.03.30
драйвера ADO


2-1204472475
Alex
2008-03-02 18:41
2008.03.30
Совсем лёгкий вопрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский