2016-03-14 4 views
0

Позвольте мне уточнить. У меня есть таблица, как это (обновляется, чтобы включить больше пример)Выбор связанных строк в MySQL

| id | date  | cust | label     | paid | due | 
+----+-----------+------+-------------------------+------+-------+ 
| 1 |2016-02-02 | 1 | SALE: Acme Golf Balls | 0 | 1000 | 
| 20 |2016-03-01 | 1 | PAYMENT: transaction #1 | 700 |  0 | 
| 29 |2016-03-02 | 1 | PAYMENT: transaction #1 | 300 |  0 | 
| 30 |2016-03-02 | 3 | SALE: Acme Large Anvil | 500 | 700 | 
| 32 |2016-03-02 | 3 | PAYMENT: transaction #30| 100 |  0 | 
| 33 |2016-03-03 | 2 | SALE: Acme Rockets  | 0 | 2000 | 

Теперь мне нужно вывести таблицу, которая показывает объем продаж, которые не были выплачены в полном объеме и на оставшуюся сумму. Как мне это сделать? Там не так много информации о том, как связывать строки из одной таблицы.

EDIT: Вот вывод таблицы я думаю сделать

Table: debts_n_loans 
| cust | label     | amount | 
========================================== 
| 3 | SALE: Acme Large Anvil | 100 | 
| 2 | SALE: Acme Rockets  | 2000 | 
+0

Если вы не можете идентифицировать связанные строки, то вы не можете делать то, что хотите. Предоставляет ли 'cust' информацию? –

+0

@GordonLinoff Транзакция # в конце ярлыка относится к 'id', чья продажа - это оплата. – starleaf1

ответ

1

Если cust является ключом, который связывает их вместе, то вы можете просто использовать aggregation и пункт having:

select cust, sum(paid), sum(due) 
from t 
group by cust 
having sum(paid) <> sum(due); 

Если вы хотите получить подробную информацию, вы можете использовать join, in или exists, чтобы получить подробную информацию.

EDIT:

Если вам нужно сделать это, используя транзакцию в конце строки:

select t.id, t.due, sum(tpay.paid) as paid 
from t left join 
    t tpay 
    on tpay.label like '%#' || t.id 
where t.label like 'SALE:%' and 
     tpay.label like 'PAYMENT:%' 
group by t.id, t.due 
having t.due <> sum(tpay.paid); 
0

Так что вам нужно только строки с из-за больше, чем 0

SELECT * FROM <table> WHERE due > 0;

0

Попробуйте следующее:

SELECT 
    cust, 
    SUM(due) - SUM(paid) AS remaining 
FROM t1 
GROUP BY cust 
HAVING SUM(due) > SUM(paid); 
+0

Я не пытаюсь рассчитать долг каждого клиента, а оставшуюся часть транзакции. – starleaf1

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