2015-09-05 77 views
2

我有一個表(名爲stock_level)形式SQL行之間的版本比較1天,1周前

product_code | quantity | date 

而且我想

product_code | date | quantity today - quantity 1 week ago | quantity today - quantity 1 day ago 

所以創建窗體的視圖遠我有我的選擇爲:

SELECT d.product_code, d.date, d.day_change, w.week_change 
FROM (SELECT p1.date, p1.product_code, p1.quantity - p2.quantity as day_change 
FROM stock_level p1 
INNER JOIN stock_level p2 
    ON p1.product_code = p2.product_code 
    AND p2.date = p1.date - INTERVAL 1 DAY) d 
INNER JOIN 
(SELECT p1.date, p1.product_code, p1.quantity - p2.quantity as week_change 
FROM stock_level p1 
INNER JOIN stock_level p2 
    ON p1.product_code = p2.product_code 
    AND p2.date = p1.date - INTERVAL 7 DAY) w 
ON d.product_code = w.product_code 
AND d.date = w.date 
ORDER BY d.date desc 

雖然我在做什麼似乎工作,它不覺得很有效率(有三加入例如,當邏輯上它應該採取2)

有沒有更好的辦法,我可以做到這一點?

+0

檢查哪一天是第一天 - 我不確定這是否是問題,但是當我們討論周時期時,我想到了這一點 –

+0

@BogdanBogdanov理想情況下,我會確保它排除週末,但這是另一個問題共!如果你知道一個解決方案,將有助於那將是驚人的 – Edd

回答

3

爲此,您可以使用條件彙總: 你應該只表示這種使用LEFT JOIN和單個連接的每一天過去:

SELECT slnow.product_code, slnow.date, 
     (slnow.quantity - sl1.quantity) as day_change, 
     (slnow.quantity - sl7.quantity) as week_change 
FROM stock_level slnow LEFT JOIN 
    slock_level sl1 
    ON slnow.product_code = sl1.product_code AND 
     sl1.date = slnow.date - interval 1 day LEFT JOIN 
    stock_level sl7 
    ON slnow.product_code = sl7.product_code AND 
     sl7.date = slnow.date - interval 7 day 
ORDER BY slnow.date DESC; 

此外,MySQL的不允許FROM子句中的子查詢對於一個視圖,所以你的查詢不適用於視圖。

+0

更好的解決方案謝謝:) – Edd

2

您的查詢對我看起來不錯。 SQL的挑戰之一是,當你解決像這樣的現實世界的問題時,它會變得冗長和重複。我發現使用我稱之爲「俱樂部三明治」格式的東西很有幫助 - 它使結構結構化查詢語言可見。

SELECT d.product_code, d.date, d.day_change, w.week_change 
    FROM (
      SELECT p1.date, p1.product_code, 
        p1.quantity - p2.quantity as day_change 
      FROM stock_level p1 
      INNER JOIN stock_level p2 ON p1.product_code = p2.product_code 
             AND p2.date = p1.date - INTERVAL 1 DAY 
      ) d 
INNER JOIN (
      SELECT p1.date, p1.product_code, 
        p1.quantity - p2.quantity as week_change 
      FROM stock_level p1 
      INNER JOIN stock_level p2 ON p1.product_code = p2.product_code 
             AND p2.date = p1.date - INTERVAL 7 DAY 
     ) w ON d.product_code = w.product_code 
      AND d.date = w.date 
ORDER BY d.date desc 

看看查詢是如何堆疊不同的東西,如三明治?

這對查詢工作的下一個人很有幫助。只需一點點視覺模式識別,她就能識別出任何其他語言中的方法調用。

有一件小事要注意。查詢中的INNER JOIN將用於抑制結果集中的行,以查找前一天或一週前沒有庫存的項目。改爲嘗試LEFT JOIN

+0

關於左加入好的提示,謝謝:) – Edd

+0

良好的格式 - 很容易閱讀什麼是查詢所有。 –