Sql 在新列中重复行的值

Sql 在新列中重复行的值,sql,oracle,oracle11g,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

我在这张表中列出了以下数据

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

有人能帮我解答这个问题吗?因为我不知道如何才能做到这一点

您如何知道为每一行(电视或手机)分配什么值

但为了避免这种“小”细节,您首先需要添加一个包含ALTER语句的列:

ALTER TABLE yourTVAndMobileData
ADD Category varchar2(15);
UPDATE yourTVAndMobileData
SET Category = DECODE ( id, ( SELECT m.id 
                                  FROM Mobiles m 
                                  WHERE m.id=id; ), "Mobile",
                            "TV" );
然后使用update语句更新所有行:

ALTER TABLE yourTVAndMobileData
ADD Category varchar2(15);
UPDATE yourTVAndMobileData
SET Category = DECODE ( id, ( SELECT m.id 
                                  FROM Mobiles m 
                                  WHERE m.id=id; ), "Mobile",
                            "TV" );
我假设您有一个带有列“id”的表Mobiles,该列是所有设备表的外键。改变这种逻辑,因为它适合你


我认为这应该行得通。如果没有,请告诉我。

这里的数据设计似乎有很多问题,我真的认为您需要在尝试进行查询之前解决这些问题。首先,看起来Electro是一个类别,因此应该是一个专栏,但Product已经在做这项工作,这使得Electro在任何形式上看起来都是多余的。如果Electro不是冗余的,它应该有自己的列

您包含null的行也表明您的数据设计几乎肯定有问题,因为您的电视机似乎不太可能既没有制造商也没有价格

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

我认为,鉴于您似乎拥有的数据,您无法真正获得想要实现的结果,而在我看来,您的基础数据似乎需要重新设计。

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
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
| 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 |
查询1

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
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
| 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 |

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
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
| 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 |

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

表的大小是多少?空值是什么意思?如果有更多的行?它们是否总是使用与每个类别6相同的格式?您需要此选项来更改表还是只希望select查询返回此选项?格式可以更改只是我需要一个select查询来返回结果谢谢回复我需要的只是一个select语句您不能创建新列并使用select语句更新行的值。或者我不太了解你?