2013-04-16 1 views
2

У меня есть таблица расходов, разработанная с использованием sqlite. Я хотел бы построить запрос для фильтрации некоторых случайных строк, используя функцию суммы в столбце количества таблицы.Фильтрация случайных строк в таблице с помощью функции sum

Образец Expense стол

Clients   Amounts 
A     1000 
B     3000 
C     5000 
D     2000 
E     6000 

Предполагая, что я хотел бы общую сумму в таблице выше, чтобы быть 10,000 я хотел бы построить запрос, который будет возвращать любое количество Randoms строк, которые бы добавить до 10000

до сих пор я пытался

SELECT * 
FROM Expense Table 
GROUP BY (Clients) 
HAVING SUM(AMOUNT)=10000 

, но я получил ничего не генерироваться

У меня также была проблема со случайной функцией, но я предполагаю, что мне нужно указать LIMIT

+0

Что вас озадачивает? Вы группируете «Клиенты». Таким образом, вы должны получить 'SUM' от' Клиентов', что составляет 10 000. У вас их нет. –

+0

Каков ваш желаемый результат с данными вашего образца выше? BCD = 10000 и ABE = 10000. – sgeddes

+0

Я хотел бы получить случайный вывод строк, суммированных до 10000, так что один из них –

ответ

0

SQLLite не поддерживает CTE (в частности, рекурсивные), поэтому я не могу придумать простой способ сделать это. Возможно, вам было бы лучше сделать это в своей логике представления.

Одним из вариантов с помощью SQL будет строка для объединения нескольких операторов UNION. Используя свои вышеуказанные данные примеры, вам нужно будет строка 3 UNIONs, чтобы получить результаты:

select clients 
from expense 
where amounts = 10000 
union 
select e.clients || e2.clients 
from expense e 
    inner join expense e2 on e2.rowid > e.rowid 
where e.amounts + e2.amounts = 10000 
union 
select e.clients || e2.clients || e3.clients 
from expense e 
    inner join expense e2 on e2.rowid > e.rowid 
    inner join expense e3 on e3.rowid > e2.rowid 
where e.amounts + e2.amounts + e3.amounts = 10000 

Результирующее в ABE и BCD. Это будет работать для любой группы клиентов, от 1 до 3, чья сумма составляет 10000. Вы можете объединить больше союзов, чтобы получить больше клиентов - это всего лишь пример.

SQL Fiddle Demo

(Вот образец до 4 клиентов - http://sqlfiddle.com/#!7/b01cf/2).

Возможно, вы можете использовать динамический sql для создания бесконечного запроса, если это необходимо, однако я считаю, что это лучше подходит для презентации.

+0

Это похоже на действительно сложное решение, но оно выглядит лучше, чем все, что я придумал. Есть ли способ, которым я могу вернуть только один из этих результатов наугад? –

+0

@BennOgidan - зависит от версии sqllite, которую вы используете. попробуйте это (http://sqlfiddle.com/#!5/f3b92/1) - нажмите «Отменить», чтобы использовать редактор sql.js. – sgeddes

+0

Спасибо за это, это гораздо ближе, но формат, который я бы хотел, чтобы они были возвращены, будет состоять из строки за строкой вместо объединения, поэтому ** Клиенты B 3000, Клиент C 5000, Клиент D 2000 ** –

0

Что вы описываете, это knapsack problem (в вашем случае это значение равно весу).

Это может быть разрешено в SQL (см. Ответ sgeddes), но из-за ориентированного на SQL проектирования SQL вычисление довольно сложное и очень медленное.

Вам было бы лучше, читая суммы в вашей программе и решая проблему там (см. the pseudocode on the Wikipedia page).

Смежные вопросы