繁体   English   中英

MS Access SQL从不同的表获取结果并按日期排序

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

我希望我的描述就足够了。 我试图删除所有不重要的字段。

我有5个表格(客户,发票,物料,Invoice_Item,付款):

客户字段和采样日期为:

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

发票字段和样品日期为:

+----+-----------+----------+------+
| 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 |
+----+-----------+----------+------+

项目字段和样本数据是:

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

Invoice_Item字段和示例数据是:

+------------+---------+--------+------------+
| 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 |
+------------+---------+--------+------------+

价格在此表中而不在物料表中的原因是因为它是客户特定的价格。

付款字段为:

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

因此我的报告应合并所有表格,并按DATE(来自发票或付款方式)为特定客户排序。

因此,例如对于客户John(1)来说,它应该像这样:

+------------+----------------+---------+-----------+
| 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 |
+------------+----------------+---------+-----------+

按日期排序,发票金额为((金额*单价)的总和)*(1-税)

我开始工会,但后来迷路了。

这是我的尝试:

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

感谢您的帮助!

谢谢

您可以使用以下SQL脚本生成所需的报告:

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

注意:我已将CustomerID添加到输出中,以便您知道数据对应的客户。

这是对我有用的答案,它与@Catzeye Answer相比有所修正,后者没有显示联盟的第二部分。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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