[英]SQL : Creating View using MAX() + SUM() with 3 related tables
在SQL Server中,我有一個包含3個相關表的視圖。 (材料,訂單,訂單明細)
每個“訂單”包含幾個“ OrderDetail”,每個“ OrderDetail”包含1個“ Material”。
Table Material
----------------------------
MaterialID MaterialName
1 egg
2 flour
3 butter
Table Order
----------------------------
OrderID Date
1 2019-1-01
2 2019-12-12
3 2019-6-06
Table OrderDetail
----------------------------
DetailID OrderID MaterialID Price Quantity Total
1 1 1 10 5 50
2 1 2 100 5 500
3 2 2 200 4 800
4 2 3 2000 4 8000
5 3 3 1000 3 3000
6 3 1 20 3 60
這是我創建的原始視圖
View Original
----------------------------
MaterialID OrderID Date Price Total
1 1 2019-1-01 10 50
1 3 2019-6-06 20 60
2 1 2019-1-01 100 500
2 2 2019-12-12 200 800
3 2 2019-12-12 2000 8000
3 3 2019-6-06 1000 3000
現在,我希望它找到“最新價格”(與“最新日期”綁定)和“總和”(我在每種材料上花費的全部費用)
View Edit
----------------------------
MaterialID OrderID LatestDate LatestPrice Sum
1 3 2019-6-06 20 110
2 2 2019-12-12 200 1300
3 2 2019-12-12 2000 11100
我知道如何使用Max(Date)Max(Price)Sum(total)Group By分別過濾每個列,但是我仍然不熟悉Subquery,INNER join和其他技術。
感謝您的時間。 我已經盡力說明了這個問題,如果需要任何其他信息,請隨時詢問:)。
這可以使用CROSS APPLY
回答您的原始問題:
SELECT m.MaterialID, od.OrderID, od.Date, od.Price, od.Total
FROM Material m CROSS APPLY JOIN
(SELECT TOP (1) od.*, o.date
FROM OrderDetail od INNER JOIN
Orders o
ON od.OrderID = o.OrderID
WHERE m.MaterialID = od.MaterialID
ORDER BY o.Date DESC
) od
ORDER BY m.MaterialID;
這將使用窗口函數回答您的修訂問題:
SELECT MaterialID, oOrderID, Date, Price, Total, sum_total
FROM (SELECT m.MaterialID, od.OrderID, o.Date,
od.Price, od.Total,
SUM(od.total) OVER (PARTITION BY m.MaterialId) as sum_total,
ROW_NUMBER() OVER (PARTITION BY m.MaterialId ORDER BY o.Date DESC) as seqnum
FROM Material m INNER JOIN
OrderDetail od
ON m.MaterialID = od.MaterialID INNER JOIN
Orders o
ON od.OrderID = o.OrderID
) mod
WHERE seqnum = 1
ORDER BY m.MaterialID;
您可以通過CTE做到這一點:
WITH CTE AS (
SELECT
m.MaterialID, od.OrderID, o.Date,
od.Price, od.Total
FROM Material m
INNER JOIN OrderDetail od ON m.MaterialID = od.MaterialID
INNER JOIN [Order] o ON od.OrderID = o.OrderID
)
SELECT
c.MaterialID, c.OrderID, c.Date LatestDate,
c.Price LatestPrice, g.Sum
FROM CTE c INNER JOIN (
SELECT MaterialID, MAX(Date) maxdate, SUM(Total) Sum
FROM CTE
GROUP BY MaterialID
) g ON g.MaterialID = c.MaterialID AND g.maxdate = c.Date
ORDER BY c.MaterialID
參見演示 。
結果:
> MaterialID | OrderID | LatestDate | LatestPrice | Sum
> ---------: | ------: | :------------------ | ----------: | ---:
> 1 | 3 | 06/06/2019 00:00:00 | 20 | 110
> 2 | 2 | 12/12/2019 00:00:00 | 200 | 1300
> 3 | 2 | 12/12/2019 00:00:00 | 2000 |11000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.