重复新列中的行的值

时间:2015-09-06 21:14:24

标签: sql oracle oracle11g

我在这张表中包含以下数据

id    Product     Price 
1      ELECTRO     TV
2      null       null
3      null       null
4      Samsung    1000
5      LG         2000
6      Philips    1300
7      ELECTRO    Mobile
8      null       null
9      null       null
10     Samsung    1000
11     Nokia      2000
12     Sony       1300

我需要添加另一列并重复结果表的值,如下所示:

    id    Product     Price     Category
    1      ELECTRO     TV         TV
    2      null       null        TV
    3      null       null        TV
    4      Samsung    1000        TV
    5      LG         2000        TV
    6      Philips    1300        TV
    7      ELECTRO    Mobile      Mobile
    8      null       null        Mobile
    9      null       null        Mobile
    10     Samsung    1000        Mobile
    11     Nokia      2000        Mobile
    12     Sony       1300        Mobile

有人可以帮我解决这个问题吗?因为我不知道我该怎么做

4 个答案:

答案 0 :(得分:2)

这里的数据设计似乎有很多问题,我真的认为在尝试进行查询之前需要解决这些问题。对于初学者来说,看起来Electro是一个类别,因此应该是一个专栏,但是Product已经开始工作,这使得任何形式的Electro看起来都是多余的。如果Electro在某种程度上不是多余的,它应该拥有它自己的专栏。

您的行包含null也是一种症状,表明您的数据设计几乎肯定存在问题,因为您似乎不太可能拥有既没有制造商又没有价格的电视。

此外,您在价格列中似乎有混合数字和字符数据:再次表明数据设计存在严重缺陷。

我不认为你可以根据你看到的数据真正得到你想要达到的结果,对我来说,看起来好像你的基础数据需要重新设计。

答案 1 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE test (id, Product, Price ) AS
          SELECT 1,  'ELECTRO', 'TV'     FROM DUAL
UNION ALL SELECT 2,  null,      null     FROM DUAL
UNION ALL SELECT 3,  null,      null     FROM DUAL
UNION ALL SELECT 4,  'Samsung', '1000'   FROM DUAL
UNION ALL SELECT 5,  'LG',      '2000'   FROM DUAL
UNION ALL SELECT 6,  'Philips', '1300'   FROM DUAL
UNION ALL SELECT 7,  'ELECTRO', 'Mobile' FROM DUAL
UNION ALL SELECT 8,  null,      null     FROM DUAL
UNION ALL SELECT 9,  null,      null     FROM DUAL
UNION ALL SELECT 10, 'Samsung', '1000'   FROM DUAL
UNION ALL SELECT 11, 'Nokia',   '2000'   FROM DUAL
UNION ALL SELECT 12, 'Sony',    '1300'   FROM DUAL

查询1

SELECT ID,
       PRODUCT,
       PRICE,
       CASE PRODUCT
         WHEN 'ELECTRO' THEN PRICE
         ELSE LAG( CASE PRODUCT WHEN 'ELECTRO' THEN PRICE END ) IGNORE NULLS OVER ( ORDER BY ID )
         END AS CATEGORY
FROM   test

<强> Results

| ID | PRODUCT |  PRICE | CATEGORY |
|----|---------|--------|----------|
|  1 | ELECTRO |     TV |       TV |
|  2 |  (null) | (null) |       TV |
|  3 |  (null) | (null) |       TV |
|  4 | Samsung |   1000 |       TV |
|  5 |      LG |   2000 |       TV |
|  6 | Philips |   1300 |       TV |
|  7 | ELECTRO | Mobile |   Mobile |
|  8 |  (null) | (null) |   Mobile |
|  9 |  (null) | (null) |   Mobile |
| 10 | Samsung |   1000 |   Mobile |
| 11 |   Nokia |   2000 |   Mobile |
| 12 |    Sony |   1300 |   Mobile |

答案 2 :(得分:0)

您如何知道分配给每一行(电视或手机)的价值?

但是避免使用“小”细节,首先需要添加一个带有ALTER语句的列:

ALTER TABLE yourTVAndMobileData
ADD Category varchar2(15);

然后使用UPDATE语句更新所有行:

UPDATE yourTVAndMobileData
SET Category = DECODE ( id, ( SELECT m.id 
                                  FROM Mobiles m 
                                  WHERE m.id=id; ), "Mobile",
                            "TV" );

我假设您有一个带有“id”列的Mobiles表,它是所有设备表的外键。改变这个适合你的逻辑。

认为这应该有效。如果没有,请告诉我......

答案 3 :(得分:0)

WITH src AS (
SELECT 1 ID  , 'ELECTRO' Product, 'TV' Price FROM DUAL UNION ALL
SELECT 2     , null      , null  FROM DUAL UNION ALL
SELECT 3     , null      , null  FROM DUAL UNION ALL
SELECT 4     , 'Samsung'   , '1000'  FROM DUAL UNION ALL
SELECT 5     , 'LG'        , '2000'  FROM DUAL UNION ALL
SELECT 6     , 'Philips'   , '1300'  FROM DUAL UNION ALL
SELECT 7     , 'ELECTRO'   , 'Mobile'  FROM DUAL UNION ALL
SELECT 8     , null      , null  FROM DUAL UNION ALL
SELECT 9     , null      , null  FROM DUAL UNION ALL
SELECT 10    , 'Samsung'   , '1000'  FROM DUAL UNION ALL
SELECT 11    , 'Nokia'     , '2000'  FROM DUAL UNION ALL
SELECT 12    , 'Sony'      , '1300'  FROM DUAL)
SELECT
    src.*,
    LAST_VALUE(NVL2(TRIM(TRANSLATE(price, '0123456789', ' ')), price, null)) IGNORE NULLS OVER (ORDER BY ID) category
FROM
    src;

但同意您的数据结构看起来并不好。