如何查询透视数据?
How Can I Query Pivoted Data?
我有一个 table,它有键值对加上它相关的项目。
例如
CAR_NAME
PART_TYPE
PART_NAME
VW
Tyre
Michelin 4WD
VW
Roof
Sun
Ford
Tyre
Michelin Sport
Ford
Roof
Glass
Audi
Tyre
Bridgestone
Audi
Roof
Soft
Mazda
Roof
Sun
实际上大约有 60 种不同的零件类型。
我想获取轮胎不是米其林的车名列表。
select * from cars
where
part_type = 'Tyre'
and part_name not like 'Michelin%'
这输出奥迪,但是,即使没有指定轮胎名称,我仍然想包括马自达。
似乎主元会有所帮助,但我不完全理解主元语法以及之后如何执行 where 子句。
SELECT * FROM
(
SELECT car_name, part_type, part_name
FROM cars
)
PIVOT
(
LISTAGG(part_name ,',')
WITHIN GROUP (ORDER BY part_type)
FOR part_type IN (select distinct part_type from cars)
)
SQL Fiddle: http://sqlfiddle.com/#!4/c89dc/1
不需要主元 table,一个简单的“或”运算符就足够了。
确保使用括号将两个条件分开。当涉及到 WHERE 子句和“AND/OR”运算符时,括号是您的朋友。
试试这个:
select * from cars
where
(part_type = 'Tyre'
and part_name not like 'Michelin%')
OR
(car_name = 'Mazda')
你真的想要更像 NOT IN
、NOT EXISTS
、LEFT JOIN
等的东西。LISTAGG
可以以类似的方式使用,但并不是真正必要的.所以这也解决了基本问题:
SELECT DISTINCT car_name
FROM cars
WHERE car_name NOT IN (
SELECT car_name FROM cars
WHERE part_type = 'Tyre'
AND part_name LIKE 'Michelin%'
);
我有一个 table,它有键值对加上它相关的项目。
例如
CAR_NAME | PART_TYPE | PART_NAME |
---|---|---|
VW | Tyre | Michelin 4WD |
VW | Roof | Sun |
Ford | Tyre | Michelin Sport |
Ford | Roof | Glass |
Audi | Tyre | Bridgestone |
Audi | Roof | Soft |
Mazda | Roof | Sun |
实际上大约有 60 种不同的零件类型。
我想获取轮胎不是米其林的车名列表。
select * from cars
where
part_type = 'Tyre'
and part_name not like 'Michelin%'
这输出奥迪,但是,即使没有指定轮胎名称,我仍然想包括马自达。
似乎主元会有所帮助,但我不完全理解主元语法以及之后如何执行 where 子句。
SELECT * FROM
(
SELECT car_name, part_type, part_name
FROM cars
)
PIVOT
(
LISTAGG(part_name ,',')
WITHIN GROUP (ORDER BY part_type)
FOR part_type IN (select distinct part_type from cars)
)
SQL Fiddle: http://sqlfiddle.com/#!4/c89dc/1
不需要主元 table,一个简单的“或”运算符就足够了。 确保使用括号将两个条件分开。当涉及到 WHERE 子句和“AND/OR”运算符时,括号是您的朋友。
试试这个:
select * from cars
where
(part_type = 'Tyre'
and part_name not like 'Michelin%')
OR
(car_name = 'Mazda')
你真的想要更像 NOT IN
、NOT EXISTS
、LEFT JOIN
等的东西。LISTAGG
可以以类似的方式使用,但并不是真正必要的.所以这也解决了基本问题:
SELECT DISTINCT car_name
FROM cars
WHERE car_name NOT IN (
SELECT car_name FROM cars
WHERE part_type = 'Tyre'
AND part_name LIKE 'Michelin%'
);