Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
15-1203053813
Tornado
2008-02-15 08:36
2008.03.30
Как подключить к инету два компа?


15-1203114175
Kostafey
2008-02-16 01:22
2008.03.30
С днем рождения ! 16 февраля


2-1204446203
махс
2008-03-02 11:23
2008.03.30
const в параметрах


4-1185978968
tio
2007-08-01 18:36
2008.03.30
Полигоны


15-1202993739
Тарантас
2008-02-14 15:55
2008.03.30
Установка SVN как сервера под Windowsбез Apache