Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с запросом, уже всю баку сломал [MSSQL]


Страницы:   1 2

Ega23 ©   (2007-11-01 12:33:00) 

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

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 - если такие есть.


Anatoly Podgoretsky   (2007-11-10 12:17:00) [1]

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

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


manevil   (2007-11-10 10:51:00) [2]

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

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


ЮЮ   (2007-11-02 03:37:00) [3]

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


> 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  


Ega23   (2007-11-01 15:43:00) [4]


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


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


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


Боже упаси!

:)


sniknik   (2007-11-01 15:32:00) [5]

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

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


Anatoly Podgoretsky   (2007-11-01 15:12:00) [6]

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

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


Ega23   (2007-11-01 15:06:00) [7]

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


sniknik   (2007-11-01 15:04:00) [8]

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


Ega23   (2007-11-01 15:01:00) [9]

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


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

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


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

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


sniknik   (2007-11-01 14:54:00) [12]

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

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


Ega23   (2007-11-01 14:49:00) [13]

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


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


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


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


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


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

> уже проверил на разных выборках.
проверь на этом
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:01:00) [16]


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


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


sniknik   (2007-11-01 13:48:00) [17]

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


sniknik   (2007-11-01 13:47:00) [18]

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 тоже не особо нужен, тк по нему строится индекс и тд, для отбора уникальных... вместо просто работы с числом.


Ega23   (2007-11-01 13:33:00) [19]

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


Кщд   (2007-11-01 13:31:00) [20]


> 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 заменить на аналог


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо