2013-07-08 4 views
0

Я следующие структуры таблиц,SQL Inner Регистрация запрос

cust_info

cust_id 
    cust_name 

bill_info

bill_id 
    cust_id 
    bill_amount 
    bill_date 

paid_info

paid_id 
    bill_id 
    paid_amount 
    paid_date 

Теперь мой вывод должен отображать записи (1 января 2013 по 1 февраля 2013 года) между двумя bill_dates датами как одну строку следующим образом,

cust_name | bill_id | bill_amount | tpaid_amount | bill_date | balance 

где tpaid_amount является общая сумма выплат за конкретного bill_id

Например ,

  • для банкнота ид ABCD, bill_amount 10000 и пользователь платит 2000 один раз и 3000 второй раз

  • средства, paid_info таблица содержит две записи для одной bill_id

    bill_id | paid_amount 
    abcd   2000 
    abcd   3000 
    

так, tpaid_amount = 2000 + 3000 = 5000 и balance = 10000 - tpaid_amount = 10000 - 5000 = 5000

Есть ли способ сделать это с помощью одного запроса (внутренние соединения)?

ответ

1

Вы хотите присоединиться к 3 таблицам, а затем сгруппировать их с помощью идентификаторов счетов и других соответствующих данных.

-- the select line, as well as getting your columns to display, is where you'll work 
-- out your computed columns, or what are called aggregate functions, such as tpaid and balance 
SELECT c.cust_name, p.bill_id, b.bill_amount, SUM(p.paid_amount) AS tpaid, b.bill_date, b.bill_amount - SUM(p.paid_amount) AS balance 
-- joining up the 3 tables here on the id columns that point to the other tables 
FROM cust_info c INNER JOIN bill_info b ON c.cust_id = b.cust_id 
INNER JOIN paid_info p ON p.bill_id = b.bill_id 
-- between pretty much does what it says 
WHERE b.bill_date BETWEEN '2013-01-01' AND '2013-02-01' 
-- in group by, we not only need to join rows together based on which bill they're for 
-- (bill_id), but also any column we want to select in SELECT. 
GROUP BY c.cust_name, p.bill_id, b.bill_amount, b.bill_date 

Краткий обзор группы по: Это будет принимать ваш результирующий набор и smoosh строк вместе, основываясь на том, где они имеют одни и те же данные в столбцах вы даете ему. Поскольку каждый счет будет иметь одно и то же имя, количество, дату и т. Д., Мы можем группировать те, а также идентификатор счета, и мы получим запись для каждого счета. Если бы мы хотели сгруппировать его по p.paid_amount, то, поскольку каждый платеж имел бы другой из них (возможно), вы получили бы запись для каждого платежа, а не за каждый счет, что не то, d хотите. Когда группа сгруппировала эти строки вместе, вы можете запускать агрегированные функции, такие как SUM (столбец). В этом примере SUM (p.paid_amount) суммирует все платежи, которые имеют этот bill_id, чтобы определить, сколько было оплачено. Для получения дополнительной информации ознакомьтесь с W3Schools chapter on group by в своих учебниках по SQL.

Надеюсь, я понял это правильно и это вам поможет.

+0

Спасибо Крейг, это сработало! но я не очень разбирался в том, как этот запрос распространяется, поскольку я новичок в sql ... :) –

+0

@Nikhil, Хорошо, я расширил свой ответ с некоторыми комментариями и объяснениями, которые, надеюсь, сделают вещи немного яснее. Надеюсь это поможет. –

+0

Да. это хорошее объяснение. Благодарю. –

1

Это сделает трюк;

select 
    cust_name, 
    bill_id, 
    bill_amount, 
    sum(paid_amount), 
    bill_date, 
    bill_amount - sum(paid_amount) 
from 
    cust_info 
    left outer join bill_info 
     left outer join paid_info 
     on bill_info.bill_id=paid_info.bill_id 
    on cust_info.cust_id=bill_info.cust_id 
where 
    bill_info.bill_date between X and Y 
group by 
    cust_name, 
    bill_id, 
    bill_amount, 
    bill_date