2016-09-14 73 views
0

我希望我的描述足够。我试图删除所有不重要的领域。MS Access SQL从不同的表中获取结果并按日期排序

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

所以我的报告应结合所有表和按日期排序(无论是从发票或付款)为一定的客户。

因此对于例如客户约翰(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 

您的帮助表示赞赏!

感谢

回答

1

您可以生成您使用以下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 

注:我已经添加到客户ID的输出,让你知道什么客户数据对应。

+0

谢谢你,我觉得有两个小失误,税i.tax不是T,并在第二个路口左转joing应当i.iD = t.Invoice_ID,甚至当我纠正他们,我在查询表达式'c.ID = i.Customer LEFT JOIN Invoice_Item t ON i.ID = t.Invoice_ID'“ – Augustus

+0

Opps,我做了更改。你能在这里粘贴完整的错误信息吗?请再次检查列名的拼写。 – Catzeye

+0

由于访问不喜欢多个连接,因此向第一个查询添加了括号。现在检查。 – Catzeye

0

这里是为我工作的答案,有点从@Catzeye答复纠正,没有显示联盟的第二部分。

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;