Подсчет суммы уникальных значений столбца

anpv

Guest
Подсчет суммы уникальных значений столбца

Доброго времени суток.
Подскажите как подсчитать сумму (количество) уникальных значений в столбце типа integer.
Запросы:
SELECT DISTINCT SUM(int_field) from table
и
SELECT SUM(int_field) from table
возвращают один результат.
Т.е. результатом запроса должно быть одно число-сумма уникальных значений по столбцу.
 

Demiurg

Guest
сумму или количество ?
если количество, то
select count(distinct iny_field) from table
 

Demiurg

Guest
select distinct int_field from table
потом в php складывай.
хотя не пойму, для чего такое может понадобится.
 

anpv

Guest
Есть 4 таблицы:
1) Таблица по продажам
CREATE TABLE `order` (
`id` int(11) NOT NULL auto_increment,
`id_user` int(11) NOT NULL default '0',
`date_of_sale` date NOT NULL default '0000-00-00', -- Дата продажи
...
2) Таблица по составу групп
CREATE TABLE `group` (
`id` int(11) NOT NULL auto_increment,
`countm` tinyint(4) NOT NULL default '0', -- Количество взрослых
`countc` tinyint(4) NOT NULL default '0', -- Количество детей
...
3) Таблица для связи между таблицами `group` и `users`
CREATE TABLE `group_user` (
`id_users` int(11) NOT NULL default '0',
`id_group` int(11) NOT NULL default '0',
...
4) Таблица с информацией о user'ах
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`f_name` varchar(120) NOT NULL default '',
`i_name` varchar(120) NOT NULL default '',
...
Нужно вычислить за определенную дату количество взрослых и детей.
В таблице order могут быть строки с одинаковыми значениями поля id_user за одну дату.
 

botan

Новичок
Ты сделал кривую структуру и сам мучаешься.
Либо твоё ТЗ изначально такого не предполагало (болезнено знакомо).
Если я правильно понял, то фишка в том что бы не считать 2 раза одного и того же юзверя, который сделал несколько покупок.
SELECT s1.id,s3.countm,s3.countc
from `order` as s1 left join `group_user`as s2 on s1.id=s2.id_users left join `group`as s3 on s3.id=s2.id_group where s1.date_of_sale='2004-01-01'
Так, если я не накосячил с синтаксисом получится табличка - слева id юзверя (который может повторяться) и число детей и взрослых при нём.
Теперь мне не понятно что вы собственно хотите увидеть. Если например число детей при юзвере изменилось на момент покупки? (Ну там маму с дочкой заколбасило они домой ушли, остались папа и 2 сына). Ну и т.д.
Я бы на вашем месте считал максимальное количество детей и взрослых которые были с этим юзверем. Но и они ведь тоже 100% правильности не обеспечат, (т.к. сыновья с дедушкой ушли мама с дочкой пришла между покупками - это никак не учтёшь). В общем не зная вашей специфики трудно что-либо советовать.
Если брать максимум, то так:
SELECT s1.id,max(s3.countm),max(s3.countc)
from `order` as s1 left join `group_user`as s2 on s1.id=s2.id_users left join `group`as s3 on s3.id=s2.id_group where s1.date_of_sale='2004-01-01' group by s1.id

Успехов :)
 

anpv

Guest
botan
>> Если я правильно понял, то фишка в том что бы не считать 2 раза одного и того же юзверя, который сделал несколько покупок.
Нет, в таблице order каждому юзеру из группы соответствует одна запись с его id, а количество взрослых и детей это дополнительная информация которая не меняется. Но у каждого юзера из группы всегда один id - группы.
И запрос:
SELECT s1.id,s3.countm,s3.countc
from `order` as s1 left join `group_user`as s2 on s1.id=s2.id_users left join `group`as s3 on s3.id=s2.id_group where s1.date_of_sale='2004-01-01'
вернет количество взр. и дет. для каждого юзера из группы.
Если применить группировку то не возможно будет одним запросом подсчитать общее количество.
А как использовать DISTINCT вместе с SUM() я не знаю.
 
Сверху