我在这张表中包含以下数据
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
有人可以帮我解决这个问题吗?因为我不知道我该怎么做
答案 0 :(得分:2)
这里的数据设计似乎有很多问题,我真的认为在尝试进行查询之前需要解决这些问题。对于初学者来说,看起来Electro是一个类别,因此应该是一个专栏,但是Product已经开始工作,这使得任何形式的Electro看起来都是多余的。如果Electro在某种程度上不是多余的,它应该拥有它自己的专栏。
您的行包含null也是一种症状,表明您的数据设计几乎肯定存在问题,因为您似乎不太可能拥有既没有制造商又没有价格的电视。
此外,您在价格列中似乎有混合数字和字符数据:再次表明数据设计存在严重缺陷。
我不认为你可以根据你看到的数据真正得到你想要达到的结果,对我来说,看起来好像你的基础数据需要重新设计。
答案 1 :(得分:1)
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;
但同意您的数据结构看起来并不好。