2

私は 3 つのテーブルを持っています。同じものを簡略化したバージョンを提示しています。

Customer_dim

[Cust_id] [Cust_Name]

Product_dim

[Prod_id] [Prod_Name]

Orders_fact

[ord_id] [Cust_id] [Prod_id]

すべての商品を購入してくださったすべてのお客様 (1 つも欠けていない) が欲しい

各顧客グループの数を顧客グループの合計数と単純に同等にするよりも、より洗練されたクエリが必要です。prod_dim

つまり、以下の種類のクエリは必要ありません (インタビューの質問であり、エレガンスにもポイントがあるため)

select cust_name 
from customers c, 
   (select cust_id, count(prod_id) cnt 
    from order_fact 
    group by cust_id where cnt = (select count(prod_id) from prod_dim)) t1
where c.cust_id = t1.cust_id
4

2 に答える 2

2

いいえcountまたはgroup byバージョン:

SELECT Cust_Name FROM Customer_dim WHERE Cust_Id NOT IN (
    SELECT c.Cust_Id FROM Product_dim p
    CROSS JOIN Customer_dim c 
    LEFT JOIN Orders_fact o ON o.Prod_Id = p.Prod_Id AND c.Cust_Id = o.Cust_Id
    WHERE Ord_Id IS NULL
)
于 2013-03-20T14:21:04.930 に答える
1

クエリに適切な構文を使用していれば、インタビューでさらに進んだ可能性があります。動作するはずのクエリのバージョンを次に示します。

select c.cust_name 
from customers c join
     (select ofa.cust_id 
      from order_fact ofa
      group by ofa.cust_id 
      having cnt = (select count(distinct prod_id) from prod_dim)
     ) ccnt
     on c.cust_id = ccnt.cust_id

ではなくhavingof 句、適切な結合構文、および適切なエイリアスの使用に注意してください。count(distinct)count()

于 2013-03-20T14:10:48.947 に答える