简体   繁体   中英

MS Access SQL getting results from different tables and sorting by date

i hope my description will be enough. i tried to remove all non-significant fields.

i have 5 tables (Customer, Invoice, Items, Invoice_Item, Payment):

Customer fields and sample date are:

+----+------+
| ID | Name |
+----+------+
|  1 | John |
|  2 | Mary |
+----+------+

Invoice fields and sample date are:

+----+-----------+----------+------+
| ID |   Date    | Customer | Tax  |
+----+-----------+----------+------+
|  1 | 1.1.2017  |        1 | 0.10 |
|  2 | 2.1.2017  |        2 | 0.10 |
|  3 | 3.1.2017  |        1 | 0.10 |
|  4 | 3.1.2017  |        2 | 0.10 |
|  5 | 8.1.2017  |        1 | 0.10 |
|  6 | 11.1.2017 |        1 | 0.10 |
|  7 | 12.1.2017 |        2 | 0.10 |
|  8 | 13.1.2017 |        1 | 0.10 |
+----+-----------+----------+------+

Item fields and sample data are:

+----+--------+
| ID |  Name  |
+----+--------+
|  1 | Door   |
|  2 | Window |
|  3 | Table  |
|  4 | Chair  |
+----+--------+

Invoice_Item fields and sample data are:

+------------+---------+--------+------------+
| Invoice_ID | Item_ID | Amount | Unit_Price |
+------------+---------+--------+------------+
|          1 |       1 |      4 |         10 |
|          1 |       2 |      2 |         20 |
|          1 |       3 |      1 |         30 |
|          1 |       4 |      2 |         40 |
|          2 |       1 |      1 |         10 |
|          2 |       3 |      1 |         15 |
|          2 |       4 |      2 |         12 |
|          3 |       3 |      4 |         15 |
|          4 |       1 |      1 |         10 |
|          4 |       2 |     20 |         30 |
|          4 |       3 |     15 |         30 |
|          5 |       1 |      4 |         10 |
|          5 |       2 |      2 |         20 |
|          5 |       3 |      1 |         30 |
|          5 |       4 |      2 |         40 |
|          6 |       1 |      1 |         10 |
|          6 |       3 |      1 |         15 |
|          6 |       4 |      2 |         12 |
|          7 |       3 |      4 |         15 |
|          8 |       1 |      1 |         10 |
|          8 |       2 |     20 |         30 |
|          8 |       3 |     15 |         30 |
+------------+---------+--------+------------+

The reason the price is in this table not in the item table is because it is customer specific price.

Payment fields are:

+----------+--------+-----------+
| Customer | Amount |   Date    |
+----------+--------+-----------+
|        1 |     40 | 3.1.2017  |
|        2 |     10 | 7.1.2017  |
|        1 |     60 | 10.1.2017 |
+----------+--------+-----------+

so my report should be combine all tables and sort by DATE (either from Invoice or Payment) for a certain customer.

so for eg for customer John (1) it should be like:

+------------+----------------+---------+-----------+
| Invoice_ID | Invoice_Amount | Payment |   Date    |
+------------+----------------+---------+-----------+
| 1          | 171            | -       | 1.1.2017  |
| 3          | 54             | -       | 3.1.2017  |
| -          | -              | 40      | 3.1.2017  |
| 5          | 171            | -       | 8.1.2017  |
| -          | 10             | 60      | 10.1.2017 |
| 6          | 44.1           | -       | 11.1.2017 |
| 8          | 954            | -       | 13.1.2017 |
+------------+----------------+---------+-----------+

it is sorted by date, Invoice amount is (sum of (Amount* unit price)) * (1-tax)

i started with union but then got lost.

here is my try:

SELECT Inv_ID as Num, SUM(Invoice_Items.II_Price*Invoice_Items.II_Amount) AS Amount, Inv_Date as Created
FROM Invoice INNER JOIN Invoice_Items ON Invoice.Inv_ID = Invoice_Items.II_Inv_ID
UNION ALL
SELECT Null as Num, P_Value as Amount, P_Date as Created
FROM Payments
ORDER BY created ASC

Your help is appreciated!

Thanks

You can generate the report you requested using the following SQL script:

SELECT CustomerID,Invoice_ID,Invoice_Amount,Payment,Date

FROM (

SELECT c.ID AS CustomerID, i.ID AS Invoice_ID, SUM((t.Amount * t.UnitPrice)*(1-i.tax)) AS Invoice_Amount, NULL AS Payment,i.Date
FROM (Customer c
LEFT JOIN Invoice i
ON c.ID = i.Customer)
LEFT JOIN Invoice_Item t
ON i.ID = t.Invoice_ID
GROUP BY c.ID, i.ID,i.Date

UNION

SELECT c.ID AS CustomerID,NULL AS Invoice_ID, NULL AS Invoice_Amount, p.Amount AS Payment, p.Date
FROM Customer c
INNER JOIN Payment p
ON c.ID = p.Customer ) a

ORDER BY CustomerID, Date, Payment ASC

Note: I've added CustomerID to the output so you know what customer the data corresponds to.

here is the Answer which worked for me, a bit corrected from @Catzeye Answer , which didnt show the second part of the Union.

SELECT c.ID AS CustomerID,NULL AS Invoice_ID, NULL AS Invoice_Amount, p.Amount AS Payment, p.Date
FROM Customer c
INNER JOIN Payment p
ON c.ID = p.Customer

UNION ALL

SELECT c.ID AS CustomerID, i.ID AS Invoice_ID, SUM((t.Amount * t.Unit_Price)*(1-i.tax)) AS Invoice_Amount, NULL AS Payment,i.Date
FROM (Customer c
INNER JOIN Invoice i
ON c.ID = i.Customer)
INNER JOIN Invoice_Item t
ON i.ID = t.Invoice_ID
GROUP BY c.ID, i.ID,i.Date

ORDER BY CustomerID, Date, Payment;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM