-6

DATE全体的な売上に関する結果を返すクエリがありますが、間隔を追加してそれらをフィルタリングしたいと考えています。

編集:データ型fs.DateKeyですDateTime

私の元のクエリ:

SELECT s.storekey, 
       e.employeekey, 
       e.parentemployeekey, 
       pc.productcategorykey, 
       pc.productcategoryname, 
       Sum(fs.salesamount)AS SalesAmount 
FROM   dimstore s 
       INNER JOIN factsales fs 
               ON fs.storekey = s.storekey 
       RIGHT JOIN dimemployee e 
               ON e.employeekey = s.storemanager 
       INNER JOIN dimproduct p 
               ON p.productkey = fs.productkey 
       INNER JOIN dimproductsubcategory psc 
               ON psc.productsubcategorykey = p.productsubcategorykey 
       INNER JOIN dimproductcategory pc 
               ON pc.productcategorykey = psc.productcategorykey 
GROUP  BY s.storekey, 
          e.employeekey, 
          e.parentemployeekey, 
          pc.productcategoryname, 
          pc.productcategorykey 
ORDER  BY employeekey 

追加しようと思ったWHERE fs.DateKey BETWEEN '2007-01-20' AND '2007-01-25'のですが、なぜか結果が間違っています。理由がわかりません。望ましい結果を達成するためのヒントや提案はありますか?

ありがとう!

4

1 に答える 1

11

コメントがたくさんあるので、回答として投稿します。

RIGHT JOIN確かに間違っています。これは、一部の店舗が存在する必要がないことを意味しますが、もちろん、販売実績はINNER JOIN. INNER JOINとにかく事実上変わっているので、問題の原因になる可能性は低いです。

a を使用したというRIGHT JOIN事実は、一部のファクトまたはディメンションで外部キーがオプションである場合があると考えていることを示しています。これがなぜなのか知りたいです。

いずれにせよ、単純なスター モデルでは、通常は のみが表示され、場合によっては が表示されINNER JOINますLEFT JOINs

ファクト テーブルは星印の中心にあるためSELECT、特にファクト テーブルに がある場合は、通常、最初にそれをリストしLEFT JOINます。

これはデータ ウェアハウスであり、おそらく大量のデータを持っているため、期待と結果を理解できるように投稿できる量はわかりませんが、使用BETWEENには両方のエンドポイントが含まれ、DATETIMEデータ型はできることに注意してください。時間部分を含みます。このため、ほとんどの場合、表記法を使用することを好みますdt >= start_date AND dt < end_dateBETWEENは基本的に のシンタックス シュガーであるため、通常はパフォーマンスの違いはありませんdt >= start_date AND dt <= end_date

于 2013-03-06T18:53:49.137 に答える