Форум: "Базы";
Текущий архив: 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