oracle sql上的值计算

vnzz0bqm  于 2022-12-03  发布在  Oracle
关注(0)|答案(3)|浏览(234)

我有这张表:

CREATE TABLE TEST
(
    TITLE  VARCHAR2(199 BYTE),
    AMOUNT NUMBER,
    VALUE  NUMBER
)

以及INSERT语句:

INSERT INTO TEST (TITLE, AMOUNT, VAL) 
VALUES (Switch, 3000, 12); 
COMMIT;

我们有一个金额= 3000最多12,现在我们需要计算。
所以

  • 3000乘以1 = 3000
  • 3000乘以2 = 6000
  • 3000乘以3 = 9000
  • 3000乘以4 = 12000
  • 3000乘以5 = 15000
  • 3000乘以6 = 18000
  • 3000乘以7 = 21000
  • 3000乘以8 = 24000
  • 3000乘以9 = 27000
  • 3000乘以10 = 30000
  • 3000乘以11 = 33000
  • 3000乘以12 = 36000

此致
需要以下格式的输出。

Title    Amount                                                     Total

Switch   30000  3000 6000 9000  12000 15000 18000 21000 24000 27000 30000 33000 36000   231000
plug
board

有人能帮助我如何在SQL中得到这个输出吗?

vsmadaxz

vsmadaxz1#

您可以使用递归查询:

WITH data (title, amount, value, idx) AS (
  SELECT title, amount, value, 1
  FROM test
UNION ALL
  SELECT title, amount, value, idx + 1
  FROM   data
  WHERE  idx < value
) SEARCH DEPTH FIRST BY title SET order_num
SELECT title, amount * idx AS value
FROM   data;

或相关的分层查询:

SELECT t.title, t.amount * l.idx AS value
FROM   test t
       CROSS JOIN LATERAL (
         SELECT LEVEL AS idx FROM DUAL CONNECT BY LEVEL <= t.value
       ) l;

其中,对于示例数据:

CREATE TABLE TEST ( TITLE VARCHAR2(199 BYTE), AMOUNT NUMBER, VALUE NUMBER )
INSERT INTO TEST ( TITLE, AMOUNT, VALUE ) VALUES ( 'Switch', 3000, 12);

两者输出:
| 标题|价值|
| - -| - -|
| 切换|三千|
| 切换|六千|
| 切换|九千|
| 切换|一万二千|
| 切换|一万五千|
| 切换|小行星18000|
| 切换|小行星21000|
| 切换|小行星24000|
| 切换|小行星27000|
| 切换|三万|
| 切换|小行星33000|
| 切换|小行星36000|
fiddle
或者,对于您的输出格式:

WITH data (title, amount, value, idx) AS (
  SELECT title, amount, value, 1
  FROM test
UNION ALL
  SELECT title, amount, value, idx + 1
  FROM   data
  WHERE  idx < value
) SEARCH DEPTH FIRST BY title SET order_num
SELECT title,
       LISTAGG(amount * idx, ' ') WITHIN GROUP (ORDER BY idx) AS amounts,
       SUM(amount*idx) AS total
FROM   data
GROUP BY title;

SELECT t.title,
       l.amounts,
       t.amount * t.value * (t.value + 1) / 2 AS total
FROM   test t
       CROSS JOIN LATERAL (
         SELECT LISTAGG(LEVEL * t.amount, ' ') WITHIN GROUP (ORDER BY LEVEL) AS amounts
         FROM   DUAL CONNECT BY LEVEL <= t.value
       ) l;

这两个输出:
| 标题|金额|总计|
| - -| - -| - -|
| 切换|3000 6000 9000 12000 15000 18000 21000 24000 27000 30000 33000 36000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2000年期间,在2000年至2|小行星234000|
fiddle

yacmzcpb

yacmzcpb2#

请按以下方式尝试:

WITH
    tbl AS
        (
            Select 'Switch' "TITLE", 3000 "AMOUNT", 12 "VAL" From Dual
        )
--
Select     TITLE, AMOUNT, TOTAL
From      (Select LEVEL "ID", TITLE "TITLE", Sum(AMOUNT * LEVEL) OVER() "TOTAL",
                  LISTAGG(AMOUNT * LEVEL, ' ') WITHIN GROUP (ORDER BY LEVEL) OVER() "AMOUNT"
          From    tbl
          Connect By LEVEL <= VAL )
Where ID = 1  
--  
--  R e s u l t :
--  TITLE   AMOUNT                                                                 TOTAL
--  ------- --------------------------------------------------------------------- ------
--  Switch  3000 6000 9000 12000 15000 18000 21000 24000 27000 30000 33000 36000    234000
vshtjzan

vshtjzan3#

亲爱的尊敬的Maven感谢您的合作,我有oracle 10 G不支持LISTAGG,我需要在10G中做什么,
谢谢
此致

相关问题