如何查询透视数据?

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 INNOT EXISTSLEFT 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%'
);