2013-09-03 2 views
1

У меня есть 2 стола Products и Invoices. Каждый Products может быть в некотором Invoices.Группа в Sqlite?

Product: 

Id| Name 
ـــــــــــــــ 
1 | pencil 
2 | pen 
3 | ruler 


Invoice: 

Id| ProductID| Serial |Qty 
ـــــــــــــــــــــــــــــ 
1 | 1  |100  |5 
2 | 1  |200  |6 
3 | 2  |300  |8 
4 | 3  |400  |18 

Когда я пишу следующий запрос

select * , SUM(Invoices.Qty) 

FROM Products left outer join Invoices on Products.Id = Invoices.ProductID 

Group by Products.Id 

результат:

Id| Name |Id|ProductID| Serial|SUM(Invoices.Qty) 
ـــــــــــــــــــــــــــــــــــــــــــــــــــــ 
1 |pencil |2 |1  |200 |11 -> (5+6) 
2 |pen |3 |2  |300 |8 
3 |ruler |4 |3  |400 |18 

он возвращает список всех продуктов, которые присоединились к последних счетом-фактурами. Он правильно вычисляет Qty, но проблема заключается в выборе последнего счета-фактуры. Как я могу написать запрос, который правильно вычисляет Qty и возвращает Invoices с id, который я хочу.

в этом примере я хочу накладная идентификатор 1 (серийный 100) не 2 (серийный 200)

+0

Какой идентификатор вы хотите? –

+1

Можете ли вы показать структуру обеих таблиц и какой результат вы хотите? –

+0

@GordonLinoff, например, если у нас есть 2 счета-фактуры с идентификаторами 10 и 11, он возвращает это последнее (счет-фактура с идентификатором 11). Но я хочу, чтобы Счет с id 10 – breceivemail

ответ

0

Попробуйте это:

SELECT *, 
(select sum(i3.qty) from Invoices i3 where i3.productId = i.productId) 
FROM invoices I 
JOIN products P 
    on I.productId = P.id 
WHERE NOT EXISTS(
    SELECT 'PREVIOUS' 
    FROM invoices I2 
    where I2.ProductId = I.productId 
    and I2.id < I.id 
) 

Таким образом, вы получите первый счет о продукте , Я не понимаю, не существует ли в вас счета-фактуры, чтобы показать продукт. Если да, то вы должны изменить запрос с левым внешним соединением

+0

Спасибо, что мне делать, если мне нужен счет-фактура с определенным идентификатором. например, есть «Продукт» с 3 «Счетами» с идентификаторами 1, 2, 3, и мне нужно второе средство счета 2. Как я могу получить эту запись? – breceivemail

+0

@breceivemail: Вы должны всегда определять общую стратегию. Запрос об этом. В вашем вопросе вы хотите первый, но если цель другая, запрос будет другим. –

0

В SQLite 3.7.11 или более поздняя версия, вы можете использовать MIN или MAX функции, чтобы заставить конкретные из группы, должны быть возвращено:

SELECT *, MIN(Invoices.Serial), SUM(Invoices.Qty) 
FROM Products LEFT JOIN Invoices ON Products.Id = Invoices.ProductID 
GROUP BY Products.Id 
+0

Мой идентификатор не всегда является минимальным. Это кабина будет Id между набором идентификаторов. – breceivemail