1

次のシミュレートされた表にはcust_nbr、注文番号を表す注文の詳細が含まれています。注文に90000が含まれてitem_nbrいる場合、90000の価格が他のアイテムと税金の合計よりも高いかどうかを知る必要があります。このテーブルには数十万のレコードがあります。私はTeradataを使用しています。

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           

次に、予備結果の各レコードについて、から90000の価格を減算し、購入が90000の価格よりも低い場合にのみ結果を返す必要がitem_nbrありpurchaseますitem_nbrnet_cb

したがって、私の最終結果は次のようになります。

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

2 に答える 2

1

私はSQLServer2005でテストしたので、まったく機能しない場合は反対票を投じないでください。お知らせください。回答を削除します:-)。私はただ助けようとしています。

これをサンプルデータとして扱います(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
于 2011-12-31T07:10:13.477 に答える
1

サブクエリを使用して必要なトランザクションを識別し、次に CASE を使用して、どのレコードが集計に貢献するかどうかを判断します。

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
         )
于 2011-12-31T09:45:48.737 に答える