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

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

SQL запрос [D6, D7, IB6.x]


maxi ©   (2004-06-09 08:44:00) 

помогите, пожалуйста, надо сделать запрос, который найдет 6 – ть клиентов, которые встречаются наибольшее количество раз в таблице из 6 столбцов???


maxi   (2004-06-11 13:36:00) [1]

нет там 45 клиентов, под номерами от 1 до 45, в таблице си 6 столбцов, и где-то 540 строк, из них надо найти 6 которые встречаются наибольшее количество раз


Sandman25   (2004-06-10 15:00:00) [2]

[12] maxi ©   (10.06.04 13:01)

Лучше переделать структуру БД. Я так понимаю, что это 6 видов ролей клиента. Если добавится 7, то придется изменять таблицу. Лучше сразу хранить в виде (клиент, роль). Тогда [1] Johnmen ©   (09.06.04 09:02)
вполне подойдет.


maxi   (2004-06-10 13:01:00) [3]

А поточнее можна!!!! и что луче


Sandman25   (2004-06-09 10:15:00) [4]

Я условно назвал эту функцию Min, в реальности она может называться иначе. Насколько я помню, в MS SQL она действительно называется иначе.
А что касается вопроса из [10], то наверное, по числу параметров различает. В некоторых СУБД вообще можно завести кучу ХП с одним названием, но разными типами или числом параметров.


Johnmen   (2004-06-09 10:11:00) [5]

А вот интересно, парсер+анализатор, видимо, "понимают" разницу между min-агр.ф-ей и min-UDF-ф-ей...


Sandman25   (2004-06-09 10:08:00) [6]

[8] Johnmen ©   (09.06.04 10:06)

Это другой min, c нсколькими параметрами. Min(1,2,3) = 1
Но если abs нет, то min уже не важен :)


Johnmen   (2004-06-09 10:06:00) [7]

>Sandman25 ©   (09.06.04 10:04) [6]
>Или Min и Abs тоже нет?

min/max - стандартизованные агрегатные ф-ии
abs - нет


Sandman25   (2004-06-09 10:04:00) [8]

А так?
Sum(
Min(Abs(L.id1 - C.id), 1) +
Min(Abs(L.id2 - C.id), 1) +
 ...
)
Или Min и Abs тоже нет?


Sandman25   (2004-06-09 10:04:00) [9]

Точнее
Sum(6 -
(Min(Abs(L.id1 - C.id), 1) +
Min(Abs(L.id2 - C.id), 1) +
...
)
)


Johnmen   (2004-06-09 09:55:00) [10]

>Sandman25 ©   (09.06.04 09:54) [3]

case в IB ?
:)


Соловьев   (2004-06-09 09:55:00) [11]


> case when L.id6 = C.id then 1 else 0 end

в ИБ такого нет - это ФБ

> Cast(L.idi=C.id as Integer),

такое не прокатит


Sandman25   (2004-06-09 09:54:00) [12]

select C.id, sum(
 case when L.id1 = C.id then 1 else 0 end +
 case when L.id2 = C.id then 1 else 0 end +
 case when L.id3 = C.id then 1 else 0 end +
 case when L.id4 = C.id then 1 else 0 end +
 case when L.id5 = C.id then 1 else 0 end +
 case when L.id6 = C.id then 1 else 0 end
)
 from clients C,
      links L
 where L.id1 = C.id
    or L.id2 = C.id
    or L.id3 = C.id
    or L.id4 = C.id
    or L.id5 = C.id
    or L.id6 = C.id
GROUP BY 1
ORDER BY 2 DESC

Если можно заменить case на Cast(L.idi=C.id as Integer), то еще лучше :)


Соловьев   (2004-06-09 09:14:00) [13]


> [1] Johnmen ©   (09.06.04 09:02)

а по остальным 5 столбцам? :)


Johnmen   (2004-06-09 09:02:00) [14]


SELECT клиент, COUNT(*) FROM Table
GROUP BY клиент
ORDER BY 2 DESC

Первые 6 записей в НД - твои...:)


Наверх

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