2011-12-31 8 views
1

次のシミュレートされたテーブルには、注文番号が表示されます。cust_nbrは注文番号を表します。注文がitem_nbr 90000を含んでいる場合、90000の価格が他の商品と税金の合計よりも大きいかどうかを知る必要があります。この表には何十万というレコードがあります。私はTeradataを使用しています。複数集計、複数フィルタ、単一テーブルSQL

CREATE TABLE Line_Item_Details_Tbl (
    cust_nbr INT, 
    trn_dt DATE, 
    str_typ VARCHAR(6), 
    trn_nbr INT, 
    item_nbr INT, 
    price DECIMAL(6,2), 
    tax DECIMAL(6,2) 
); 

サンプルデータ:

INSERT INTO Line_Item_Details_Tbl VALUES 
    (5551, '12/22/2011', 'store', 215, 12345, 10.00, 1.25); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (5551, '12/22/2011', 'store', 215, 65715, 6.25, 0.75); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (5551, '12/22/2011', 'store', 215, 90000, 40.00, 0); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (6875, '12/10/2011', 'online', 856, 72345, 8.50, 1.00); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (6875, '12/10/2011', 'online', 856, 65715, 6.25, 0.75); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (3500, '12/12/2011', 'store', 402, 54123, 45.00, 4.00); 
INSERT INTO Line_Item_Details_Tbl VALUES 
    (3500, '12/12/2011', 'store', 402, 90000, 20.00, 0); 
INSERT INTO Line_Item_Details_Tbl VALUES 

クエリは、次の操作を行う必要があります。

Select cust_nbr, trn_dt, trn_nbr, sum(price + tax) as purchase 
    For a cust_nbr with str_typ = 'store' AND contains an item_nbr = 90000, 
    aggregate price + tax for all items related to cust_nbr except item_nbr 90000 

ので、予備的な結果は次のようになります。そして、

cust_nbr : trn_dt : trn_nbr : purchase 
5551  12/22/2011 215  $18.25   
3500  12/12/2011 402  $49.00   

、レコードごとに予備的な結果、私はnet_cb

ようpurchaseからitem_nbr 90000の価格を減算して購入がitem_nbr 90000未満の 価格である場合にのみ、結果を返す必要があるので、私のエンディング結果は次のようになります。

cust_nbr trn_dt  trn_nbr net_cb 
    5551 12/22/2011 215  ($21.75)    
+0

あなたのRDBMSは何ですか? –

+0

@Michal私はTeradataを使用しています。 –

+0

@Donna:適切な[サンプルコード](http://sscce.org/)(ここではSQL文)は、任意のアドホックスキーマやサンプルデータ形式よりも便利です。サンプルは 'CREATE TABLE'と' INSERT ... VALUES'を使ってください。結果はコードの出力であり、コード自体ではないので、望ましい結果をサンプルコードとして提示する必要はありません。 – outis

答えて

1

その後、CASを使用し、必要なトランザクションを識別するために、サブクエリを使用しますどのレコードがあなたに貢献するかを集計するかどうかを決定します。

SELECT 
    transactions.cust_nbr, 
    transactions.trn_dt, 
    transactions.trn_nbr, 
    sum(price + tax)           AS total, 
    sum(CASE WHEN item_nbr = 9000 THEN 0 ELSE price + tax END) AS total_less_9000 
FROM 
(
    SELECT 
    cust_nbr, trn_dt, trn_nbr 
    FROM 
    yourTable 
    WHERE 
    str_typ = 'store' 
    AND item_nbr = 90000 
    GROUP BY 
    cust_nbr, trn_dt, trn_nbr 
) 
    AS transactions 
INNER JOIN 
    yourTable 
    ON transactions.cust_nbr = yourTable.cust_nbr 
    AND transactions.trn_dt = yourTable.trn_dt 
    AND transactions.trn_nbr = yourTable.trn_nbr 
GROUP BY 
    transactions.cust_nbr, transactions.trn_dt, transactions.trn_nbr 


あるいは単に含めるためにどのトランザクションを決定するためにHAVING句を使用します。

SELECT 
    cust_nbr, 
    trn_dt, 
    trn_nbr, 
    sum(price + tax)           AS total, 
    sum(CASE WHEN item_nbr = 9000 THEN 0 ELSE price + tax END) AS total_less_9000 
FROM 
    yourTable 
GROUP BY 
    cust_nbr, 
    trn_dt, 
    trn_nbr 
HAVING 
    MAX(CASE WHEN item_nbr = 9000 THEN 1 ELSE 0 END) = 1 

それとも...

HAVING 
    EXISTS (SELECT * FROM yourTable AS lookup 
      WHERE cust_nbr = yourTable.cust_nbr 
      AND trn_dt = yourTable.trn_dt 
      AND trn_nbr = yourTable.trn_nbr 
      AND item_nbr = 9000 
     ) 
+0

あなたの返事をありがとう!私は最初の "HAVING"の提案を使用し、それは完全に働いた!初心者を助けてくれてありがとう。 –

1

私はSQL Server 2005でテストしましたので、もしそれがまったく動作しない場合は、私に知らせて、私は私の答えを削除します:-) downvoteしないでください。私はただ助けようとしているだけです。

あなたのサンプルデータとして(SQL Server 2005でCTE)が、これを扱う:

;with ord_det (cust_nbr, trn_dt, str_typ, trn_nbr, item_nbr, price, tax) as (
    select 5551, convert(datetime, '12/22/2011', 101), 'store', 215, 12345, 10.00, 1.25 union all 
    select 5551, convert(datetime, '12/22/2011', 101), 'store', 215, 65715, 6.25, 0.75 union all 
    select 5551, convert(datetime, '12/22/2011', 101), 'store', 215, 90000, 40.00, null union all 
    select 6875, convert(datetime, '12/10/2011', 101), 'online', 856, 72345, 8.50, 1.00 union all 
    select 6875, convert(datetime, '12/10/2011', 101), 'online', 856, 65715, 6.25, 0.75 union all 
    select 3500, convert(datetime, '12/12/2011', 101), 'store', 402, 54123, 45.00, 4.00 union all 
    select 3500, convert(datetime, '12/12/2011', 101), 'store', 402, 90000, 20.00, null 
) 

最終クエリ(それだけで適切な名前を使用していない場合、私は、あなたのテーブル名がord_detであると仮定):

select t.cust_nbr, t.trn_dt, t.trn_nbr, price - purchase as net_cb from (
    select cust_nbr, trn_dt, trn_nbr, sum(price + coalesce(tax, 0)) as purchase 
    from ord_det o 
    where item_nbr <> 90000 and str_typ = 'store' 
    group by cust_nbr, trn_dt, trn_nbr 
) t 
inner join (
    select cust_nbr, trn_dt, trn_nbr, price + coalesce(tax, 0) as price 
    from ord_det o 
    where item_nbr = 90000 and str_typ = 'store' 
) t1 on t.cust_nbr = t1.cust_nbr 
where purchase < price 

結果:

cust_nbr trn_dt     trn_nbr  net_cb 
5551  2011-12-22 00:00:00.000 215   21.75 
+0

あなたの返事をありがとう - 私は本当にあなたが私を助けるために時間を取って感謝していますが、これはもう少し私を混乱させると思う! –

関連する問題