1

2つのテーブル間で集計が行われる次のクエリについて考えてみます。SalesとPromo、および集計値が計算で再び使用されます。

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でexplainを実行すると、内部クエリ自体にかかる時間は非常に短くなりますが、結合には長い時間がかかります。
  2. article_idの主キーが存在し、両方のテーブルが年ごとにパーティション化されていると想定します。
  3. 2番目のテーブルにオプションのデータが含まれているため、左外部結合。

それで、このクエリを書くためのより良い方法を提案できますか?ここまで読んでくれてありがとう:)

4

1 に答える 1

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;
于 2012-10-06T16:49:31.597 に答える