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语句更新行的值。或者我不太了解你?