【问题标题】:How Can I Query Pivoted Data?如何查询透视数据?
【发布时间】:2021-10-24 07:14:06
【问题描述】:

我有一个表,其中包含键值对以及与之相关的项目。
例如

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 小提琴:http://sqlfiddle.com/#!4/c89dc/1

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    您真的想要更多类似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%'
    );
    

    【讨论】:

      【解决方案2】:

      不需要数据透视表,一个简单的“或”运算符就足够了。 确保使用括号分隔这两个条件。当涉及到 WHERE 子句和“AND/OR”运算符时,括号是您的朋友。

      试试这个:

      select * from cars
      where 
      (part_type = 'Tyre'
      and part_name not like 'Michelin%')
      OR
      (car_name = 'Mazda')
      

      【讨论】:

      • 虽然这回答了问题中的简单示例,但它不能扩展到大型数据集,例如世界上所有的车名。
      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 2020-09-24
      • 2017-05-04
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多