1

このような顧客とその注文明細を一覧表示するSQLServer2005テーブルがあります...

Cust  | Code 
Cust1   N001
Cust2   N001
Cust2   N003
Cust2   N004
Cust3   N001
Cust3   N002
Cust3   N003
Cust3   N004

各顧客(1回)と、N002からN004までの商品を注文したかどうかをリストする結果が必要です。したがって、結果は次のようになります...

Cust  | Ordered?
Cust1   False
Cust2   True
Cust3   True

All / ANYなどのさまざまな組み合わせを試しました。最も近いのは、2つのクエリを使用することでした。最初に、次のように追加して、各行の最後にtrue/falseステートメントを取得します...

SELECT 
    Cust, Code, 
    CASE 
        WHEN Code BETWEEN 'N002' AND 'N004' THEN 'True' 
        ELSE 'False' 
    END AS Expr1 

これにより、次のようになります...

Cust  | Code | EXPR1
Cust1   N001   FALSE
Cust2   N001   FALSE
Cust2   N003   TRUE
Cust2   N004   TRUE
Cust3   N001   FALSE
Cust3   N002   TRUE
Cust3   N003   TRUE
Cust3   N004   TRUE

次に、2番目のクエリを使用して、取得した結果をグループ化します

Cust  | Ordered?
Cust1   False
Cust2   False
Cust2   True
Cust3   False
Cust3   True

だから誰もが簡単に達成するのを助けることができます...

Cust  | Ordered?
Cust1   False
Cust2   True
Cust3   True
4

2 に答える 2

1

ある種の顧客テーブルがあると思います。もしそうなら、これは以下で簡単に実行できます:

SELECT Customer.id, 
CASE WHEN DidOrder.customerId IS NOT NULL THEN true ELSE false END as ordered
FROM Customer
LEFT JOIN (SELECT DISTINCT customerId
           FROM OrderLine
           WHERE code >= 'N002' 
           AND code < 'N005') DidOrder
ON DidOrder.customerId = Customer.id

これにより、注文の有無に関係なく、すべての顧客がチェックされます。

于 2012-05-14T16:33:52.200 に答える
0

私の解決策は、値が範囲内にあるかどうかを指定する変数を追加し、それを case ステートメントで確認することです。

SELECT Cust,
       (case when sum(inrange) > 0 THEN 'True' ELSE 'False' END) AS count
from (select t.*,
             (case when code between 'N002' and 'N004' then 1 else 0 end) as inrange
      from t
     ) t
group by cust

コードの可読性を気にしない場合は、実際には 2 つの case ステートメントを 1 つに組み合わせることができます。

于 2012-05-14T16:30:00.257 に答える