1

製品のリストと、1 つのテーブルで販売された数量に対応するカウントがあります。データは次のように配置されます。

Product Name  QTY_SOLD
Mouse            23
Keyboard         25
Monitor          56
TV               10
Laptop           45
...

販売数量の ROLLING 合計が 50 を超える場合にグループが作成されるグループ ID を作成したいと考えています。製品名で注文すると、次のような出力が得られます。

Product Name   QTY_SOLD   GROUP_NBR
Keyboard          25          1
Laptop            45          1
Monitor           56          2
Mouse             23          3
TV                10          3

必要な出力を作成するために case ステートメントを作成しましたが、グループ ID カットオフを 50 から 100 に変更したい場合、またはより多くの製品と数量を取得する場合は、case ステートメントを変更し続ける必要があります。これに対応するために再帰または他の方法を使用する簡単な方法はありますか? これは Teradata 13.10 で動作します

UPDATE main FROM prod_list AS main,  
(  
SEL PROD_NAME
, QTY_SOLD
, SUM(QTY_SOLD) OVER (ORDER BY PROD_NAME ROWS UNBOUNDED PRECEDING) RUNNING  FROM prod_list   
) inr 
SET GROUP_NBR = CASE  
WHEN RUNNING < 50 THEN 1
WHEN RUNNING > 50 AND RUNNING < 100 THEN 2
WHEN RUNNING > 100 AND RUNNING < 150 THEN 3
WHEN RUNNING > 150 AND RUNNING < 200 THEN 4
WHEN RUNNING > 200 AND RUNNING < 250 THEN 5
ELSE 6  
END
WHERE main.PROD_NAME = inr.PROD_NAME ;
4

4 に答える 4

0

これは、Twelfth の提案で作成したコードです。

-- create the first entry for the recursive query
INSERT  TMP_WORK_DB.GRP_NBRS VALUES (0,1,0,2000000);


INSERT TMP_WORK_DB.GRP_NBRS (GRP_NBR,LOWER_LIMIT, UPPER_LIMIT)
WITH RECURSIVE GRP_RECRSV (GRP_NBR, LOWER_LIMIT, UPPER_LIMIT) 
AS (
SELECT 
    1 AS GRP_NBR
,   LOWER_LIMIT
,   UPPER_LIMIT
FROM TMP_WORK_DB.GRP_NBRS
UNION ALL
SELECT
    GRP_NBR + 1 
,   LOWER_LIMIT + 2000000 -- set the interval to 2 million
,   UPPER_LIMIT + 2000000 -- can be adjusted as needed
FROM GRP_RECRSV
WHERE GRP_NBR < 120 -- needed a limit so that it would not be endless
)
SELECT * FROM GRP_RECRSV
;


-- delete the first entry because it was duplicated
DELETE FROM TMP_WORK_DB.GRP_NBRS WHERE GRP_NBR = 0;

-- set grp nbr using the limits table
INSERT TMP_WORK_DB.PROD_LIST_GRP
WITH NUMOFPRODS (PROD_NAME,QTY,RUNNING) AS
(
    SELECT 
        PROD_NAME
    ,   COUNT(DISTINCT PROD_ID) AS QTY
    ,   SUM(QTY) OVER (ORDER BY QTY ROWS UNBOUNDED PRECEDING) RUNNING
    FROM TMP_WORK_DB.PROD_LIST
    GROUP BY 1
)
SELECT 
    PROD_NAME
,   QTY
,   RUNNING
,   GRP_NBR
FROM NUMOFPRODS a
JOIN TMP_WORK_DB.GRP_NBRS b ON RUNNING BETWEEN LOWER_LIMIT AND UPPER_LIMIT
;
于 2013-09-17T01:37:43.463 に答える
0

参照テーブルを作成して結合する...その後、変更はテーブルでのみ行う必要があります (後でテーブルへの変更を自動化するのに役立つ手順を作成することもできます)

疑似作成:

Create table group_nbr (low_limit,upper_limit,group_nbr)

ケースの値をそのテーブルに挿入し、大なり条件と小なり条件を使用して内部結合します。

select *, group_nbr.group_nbr
from table inner join group_nbr on RUNNING > lower_limit and RUNNING < upper_limit

コードはそのままではうまく機能しませんが、コードを変更するのに十分なアイデアが得られることを願っています。これらの値をこのように参照テーブルに残すことは、コードを変更するよりもはるかに簡単です。group_nbr テーブルに「group_id」を追加し、group_id 1 を実行制限の 1 つのセットにし、group_id を 2、3、4、5 などの実行制限の異なるセットにし、where 句を使用することで、複数の group_nbr セットアップを許可することもできます。使用する group_id を選択します。

于 2013-09-05T16:30:37.850 に答える
0

以下のロジックが役立つことを願っています.50のインクリメントについて.

UPDATE main FROM prod_list AS main,  
(  
SEL PROD_NAME
, QTY_SOLD
, SUM(QTY_SOLD) OVER (ORDER BY PROD_NAME ROWS UNBOUNDED PRECEDING) RUNNING  FROM prod_list   
) inr 
SET GROUP_NBR = RUNNING /50
WHERE main.PROD_NAME = inr.PROD_NAME ;
于 2013-09-05T16:32:36.827 に答える