Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с поиском уникальных значений / 9 сообщений из 9, страница 1 из 1
28.12.2009, 12:36
    #36389571
Владимир20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
При изучении сталкнулся с выбором уникальных значений.
Команда distinct. К примеру:
Код: plaintext
Select dictinct <stolb1>
Все уникальные значения выбирутся.

А вот к примеру мне нужно выбрать уникальное значение, но с условием
Код: plaintext
select distinct <stolb1> form <tabl1> where <stolb2>> 350  
Оно выбирает уникальные значения, но совсем не по условию Или к примеру есть 2 столбца
В одном значения, в другом сумма, как выбрать уникальные значения, но со всей суммой
Мне подсказывали
Код: plaintext
select <stolb1>, sum(<stolb2> as stolb  2  from <tabl1>
Получается тут не нужен distinct
...
Рейтинг: 0 / 0
28.12.2009, 12:46
    #36389602
Владимир20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
Код: plaintext
select <stolb1>, sum(<stolb2>) as stolb  2  from <tabl1>
Получается тут не нужен distinct[/quot]

Да сдесь используется group by, Я просто не дописал
Как вообще использовать group by?

Какие столбцы простовлять после by? И вообще, если столбец один?
...
Рейтинг: 0 / 0
28.12.2009, 14:34
    #36389944
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
> Автор: Владимир20
> Как вообще использовать group by?
> Какие столбцы простовлять после by? И вообще, если столбец один?

Уууу..... Как все запущено
а например, не знаю правда как в 2.5 версии, но можно написать так:
Код: plaintext
select sum(distinct <stolb2>) from <tabl1>
и в результате получишь сумму только уникальных значений из stolb2, а не сумму по всему столбцу stolb2.
group by для такого запроса:
Код: plaintext
select stolb1 from table1 groub by stolb1
будет равнозначен запросу:
Код: plaintext
select distinct stold1 from table1
. Но вообще могут использоватся и другие способы. Например база Northwind
из поставки SQL Server 2000. Таблица Orders, нужно выбрать сколько должен каждый клиент за все заказанные позиции:
Код: plaintext
1.
2.
3.
4.
5.
SELECT   o.CustomerID,
         SUM(od.UnitPrice*od.Quantity) AS AllSumFromCustomer
FROM     Orders                        AS o
         INNER JOIN [ORDER Details]    AS od
         ON       o.OrderID = od.OrderID
GROUP BY o.CustomerID
Группировка по ID клиента дает нам эту разбивку, без групировки у нас получилась сумма общего долга всех
клиентов.
Ну и так далее.

З.Ы. Идут праздники, сделай себе новогодний подарок в виде Грабера и почитай в выходные.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.12.2009, 14:47
    #36389979
Владимир20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
Игорь Горбонос,
Спасибо, стало немного понятней)
А вот посмотри будет ли правильным:

У меня есть таблица, Есть много дат, так же много счетов. Мне нужно выбрать последюю дату, объеденить одинаковые счета, но при условии, что Tps<3, и высчитать всю сумму для каждого, уже единого значения счёта) вот код :
Код: plaintext
1.
2.
3.
4.
5.
select dtr,shpz,shvo,tps,sum(sumf) as sumf;
from f302928;
where dtr in (select max(dtr) as dtr from f302928);
And tps< 3 ;
group by  1 , 2 ;
order by  1 , 2 
...
Рейтинг: 0 / 0
28.12.2009, 15:01
    #36390011
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
> Автор: Владимир20

Да вроде все правильно, только я привык указывать в group by все поля, не используемые в агрегирующих функциях, не
смотря на то что синтаксис позволяет этого не делать

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.12.2009, 15:41
    #36390131
quxix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
стандарт жестко прописывает как надо делать,в младших версиях фокса прокатит, а в старших вылетит ошибка-кроме того заранее прививается неправильный метод написания запросов с группировкой. Вот так будет правильно:
Код: plaintext
1.
2.
3.
4.
5.
select dtr,shpz,shvo,tps,sum(sumf) as sumf;
from f302928;
where dtr in (select max(dtr) from f302928);
And tps< 3 ;
group by dtr,shpz,shvo,tps;
order by  1 , 2 
смотри,что получается,
ты выбираешь какую-либо максимальную дату(где Tps-любое), а потом выбираешь строки по условию tps<3 ,а если в подзапросе попадется такая максимальная дата где tps>=3, то в твоём случае строки с tps<3 просто не попадут в набор.
Может правильней будет так,хотя не совсем ясно условие задачи.
Код: plaintext
1.
2.
3.
4.
5.
select dtr,shpz,shvo,tps,sum(sumf) as sumf;
from f302928;
where dtr in (select max(dtr) from f302928 and tps< 3 );
And tps< 3 ;
group by dtr,shpz,shvo,tps;
order by dtr,shpz
...
Рейтинг: 0 / 0
28.12.2009, 15:59
    #36390189
Владимир20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
quxix,

А в group by можно проставлять все столбцы, которые были в select
...
Рейтинг: 0 / 0
28.12.2009, 16:19
    #36390250
quxix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
Владимир20quxix,

А в group by можно проставлять все столбцы, которые были в select
Не можно,а нужно, кроме столбцов(правильнее выражений) участвующих в функциях агрегирования
примеры:

Код: plaintext
1.
2.
select  1  as a,column1,column2,sum(column4),count(*),count( 1 ),min(column6)
from MyTable
group by column1,column2
-т.к. константа 1 не меняется по всему диапазону выборки-её можно не указывать.

А вот здесь нужно указать,т.к. не знаем как поведет себя наше динамическое значение по всей выборке
Код: plaintext
1.
2.
select iif(column1< 10 , 1 , 2  )as a,column1,column2,column4,sum(column4+ 456 ),count( 7 ),count( 1 ),min(column6)
from MyTable
group by a,column1,column2,column4
эта запись тождественна вот такой, по стандарту ANSI,но фокс её не примет(т.к. там свой интерпретатор SQL),(но на будущее учти,если вдруг придется столкнуться с другими СУБД)
Код: plaintext
1.
2.
select iif(column1< 10 , 1 , 2  )as a,column1,column2,column4,sum(column4+ 456 ),count( 7 ),count( 1 ),min(column6)
from MyTable
group by iif(column1< 10 , 1 , 2  ),column1,column2,column4
...
Рейтинг: 0 / 0
28.12.2009, 16:35
    #36390294
Владимир20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с поиском уникальных значений
quxix,

Большое спасибо!
По книжках, да примерах вроде тоже понятно, но не сильно обширно. Т.е, есть 2-3 однотипных примера и всё
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с поиском уникальных значений / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]