2012-10-04 90 views
1

考慮以下查詢,其中發生跨兩個表的聚合:Sales和Promo以及聚合值再次用於計算。TERADATA:跨多個表彙總

SELECT 

    sales.article_id, 
    avg((sales.euro_value - ZEROIFNULL(promo.euro_value))/NULLIFZERO(sales.qty - ZEROIFNULL(promo.qty))) 

FROM 
( SELECT 
     sales.article_id, 
     sum(sales.euro_value), 
     sum(sales.qty) 
    from SALES_TABLE sales 
    where year >= 2011 
    group by article_id 
) sales 
LEFT OUTER JOIN 
( SELECT 
     promo.article_id, 
     sum(promo.euro_value), 
     sum(promo.qty) 
    from PROMOTION_TABLE promo 
    where year >= 2011 
    group by article_id 
) promo 

ON sales.article_id = promo.article_id 

GROUP BY sales.article_id; 

上查詢一些注意事項:

  1. 兩個內查詢返回的行數量龐大,由於大量文章。在teradata上運行解釋,內部查詢本身佔用的時間非常少,但連接需要很長時間。
  2. 假定article_id上​​的主鍵存在,並且這兩個表按年分區。
  3. 左外連接,因爲第二個表包含可選數據。

所以,你可以建議一個更好的方式來寫這個查詢。感謝您閱讀這個:)

+0

PROMO和SALES表的主要指標是什麼?這聽起來像一個線軸重新分配或傾斜問題可能會影響您的查詢。你能分享一下EXPLAIN嗎? –

+0

這兩個內部查詢都會生成唯一的'article_id'值,因爲相應的結果按'article_id'分組。因此,您不需要在外部查詢中通過「article_id」進行分組。嘗試擺脫外部分組,看看是否以任何方式加快您的查詢。 –

+0

是的,我同意。在此查詢中,外部組by不是必需的。但在性能方面,它沒有太大的區別 – dexter

回答

2

不太確定avg函數如何進入混合,所以我刪除它。

SELECT article_id, 
     (SUM(sales_value) - SUM(promo_value))/
     (SUM(sales_qty) - SUM(promo_qty)) 
FROM (
    SELECT 
     article_id, 
     sum(euro_value) AS sales_value, 
     sum(qty) AS sales_qty, 
     0 AS promo_value, 
     0 AS promo_qty 
    from SALES_TABLE sales 
    where year >= 2011 
    group by article_id 
    UNION ALL 
    SELECT 
     article_id, 
     0 AS sales_value, 
     0 AS sales_qty, 
     sum(euro_value) AS promo_value, 
     sum(qty) AS promo_qty 
    from SALES_TABLE sales 
    where year >= 2011 
    group by article_id 
) AS comb 

GROUP BY article_id; 
+0

帶有佔位符的聯合查詢做到了這一點。謝謝 :) – dexter