0

次のテーブルがあります。

  1. Dim_Date
  2. Dim_Prod_Cat
  3. Fact_Prod_Sales_By_Cat

私はSQLを持っています:

Select b.date_key,
       b.day_name_of_week,
       a.name prod_cat_name,
       Sum(nvl(a.total_sales,0))
 From Dim_Date b
 Left Outer Join (Select * 
                   From Fact_Prod_Sales_By Cat sa 
                  Inner Join Dim_Prod_Cat c 
                     On sa.prod_cat_key = c.prod_cat_key) a
   ON a.date_key = b.date_key
Group By a.name,b.date_key

問題は、Fact テーブルでたとえば日曜日に売上がない場合、その Prod_cat のレコード行を取得できないことです。

Dim_Date には、5 年間 (3 年前と 2 年間) の日付に相当するすべてのデータがあります。

期待される:

Prod_Cat Week_Day_Name  Sales
-------- -------------  -----------
C1   Monday     1000.00

C1   Tuesday    100.00
...

..

C1  Sunday      0.00 <----

..

..

C2  Monday          1000.00

..

..

C2  Saturday        0.00 <---

C2  Sunday          10000.00

...

..
4

3 に答える 3

0

単純な集計クエリは次のようになります。

Select   d.day_name_of_week,
         c.name prod_cat_name,
         Sum(f.total_sales)
 From    Dim_Date               d
 Join    Fact_Prod_Sales_By Cat f ON f.date_key     = d.date_key
 Join    Dim_Prod_Cat           c On f.prod_cat_key = c.prod_cat_key
Group By d.day_name_of_week,
         c.name prod_cat_name

それに基づいて、不足している日数を埋めるために、最近の Oracle バージョンでパーティション化された外部結合を使用できます。

Select v.prod_cat_name,
       t.day_name_of_week,
       Coalesce(v.total_sales,0) total_sales
from (
    Select   d.day_name_of_week,
             c.name prod_cat_name,
             Sum(f.total_sales) total_sales
     From    Dim_Date               d
     Join    Fact_Prod_Sales_By Cat f ON f.date_key     = d.date_key
     Join    Dim_Prod_Cat           c On f.prod_cat_key = c.prod_cat_key
    Group By d.day_name_of_week,
             c.name prod_cat_name) v
partition by (v.prod_cat_name)
right outer join
 (select distinct day_name_of_week
  FROM   dim_date) t
ON (v.day_name_of_week = t.day_name_of_week);
于 2013-08-30T15:44:42.677 に答える
0

各テーブルの属性も教えていただけると助かります。

このスターター クエリから、私が見つけた 1 つのエラーはd(あるべきだと思いますb) の使用であり、nodが定義されています。

次のようなことを試してください:

SELECT b.date_key, b.day_name_of_week, a.name, SUM(a.tot)
    FROM Dim_Date b JOIN
        (SELECT c.name, nvl(sa.total_sales,0) AS tot, sa.date_key
            FROM Fact_Prod_Sales_By_Cat sa 
                INNER JOIN Dim_Prod_Cat c ON sa.prod_cat_key = c.prod_cat_key) a
        ON a.date_key = b.date_key
            GROUP BY a.name,b.date_key;

2 回目の試行:

SELECT b.date_key, b.day_name_of_week, a.name, SUM(a.tot)
    FROM Dim_Date b JOIN
        (SELECT c.name, nvl(sa.total_sales,0) AS tot, sa.date_key
            FROM Fact_Prod_Sales_By_Cat sa 
                LEFT JOIN Dim_Prod_Cat c ON sa.prod_cat_key = c.prod_cat_key 
                    GROUP BY sa.date_key) a
        ON a.date_key = b.date_key
            GROUP BY a.name,b.date_key;
于 2013-08-29T15:57:26.473 に答える