代码之家  ›  专栏  ›  技术社区  ›  opticyclic

如何查询数据透视?

  •  0
  • opticyclic  · 技术社区  · 5 年前

    我有一个表,其中包含键值对和它相关的项。
    例如

    车名 零件类型 零件名称
    大众汽车 轮胎 米其林4WD
    大众汽车 顶部 太阳
    河流浅水处 轮胎 米其林体育
    河流浅水处 顶部 玻璃
    奥迪 轮胎 普利司通
    奥迪 顶部 软的
    马自达 顶部 太阳

    实际上,大约有60种不同的零件类型。

    我想得到一份轮胎不是米其林的车名列表。

    select * from cars
    where 
    part_type = 'Tyre'
    and part_name not like 'Michelin%'
    

    这是奥迪,但是,我仍然希望包括马自达,即使轮胎名称没有指定。

    看起来pivot会有所帮助,但我不完全理解pivot语法,以及之后如何执行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

    0 回复  |  直到 5 年前
        1
  •  1
  •   Jon Armstrong    5 年前

    你真的想要更像 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%'
    );
    
        2
  •  0
  •   griv    5 年前

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

    试试这个:

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