簡體   English   中英

SQL:使用MAX()+ SUM()和3個相關表創建視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM