SELECT DISTINCT HAVING计算独特条件

vfx*_*dev 18 sql

我已经搜索了这个答案但是找不到如何根据条件得到这个独特的记录集.我有一个包含以下示例数据的表:

Type    Color   Location    Supplier
----    -----   --------    --------
Apple   Green   New York    ABC
Apple   Green   New York    XYZ
Apple   Green   Los Angeles ABC
Apple   Red     Chicago     ABC
Apple   Red     Chicago     XYZ
Apple   Red     Chicago     DEF
Banana  Yellow  Miami       ABC
Banana  Yellow  Miami       DEF
Banana  Yellow  Miami       XYZ
Banana  Yellow  Atlanta     ABC
Run Code Online (Sandbox Code Playgroud)

我想创建一个查询,显示每个不同的Type + Color的唯一位置数,其中唯一位置的数量大于1,例如

Type    Color   UniqueLocations
----    -----   --------
Apple   Green   2
Banana  Yellow  2
Run Code Online (Sandbox Code Playgroud)

请注意,{Apple,Red,1}没有出现,因为红苹果(芝加哥)只有一个位置.我想我已经有了这个(但也许有一个更简单的方法).我正在使用:

SELECT Type, Color, Count(Location) FROM
(SELECT DISTINCT Type, Color, Location FROM MyTable)
GROUP BY Type, Color HAVING Count(Location)>1;
Run Code Online (Sandbox Code Playgroud)

如何创建另一个查询列出的查询Type, Color,以及Location每个查询Type,Color的唯一位置数Type,Color大于1 时的每个查询?生成的记录集如下所示:

Type    Color   Location
----    -----   --------
Apple   Green   New York
Apple   Green   Los Angeles
Banana  Yellow  Miami
Banana  Yellow  Atlanta
Run Code Online (Sandbox Code Playgroud)

请注意,Apple, Red, Chicago由于红苹果只有一个位置,因此不会显示.谢谢!

Mic*_*ski 19

使用a COUNT(DISTINCT Location)和连接子查询,Type并且尝试使用它们ColorGROUP BYHAVING子句将完成这项工作.

/* Be sure to use DISTINCT in the outer query to de-dup */
SELECT DISTINCT
   MyTable.Type,
   MyTable.Color,
   Location
FROM 
  MyTable
  INNER JOIN (
    /* Joined subquery returns type,color pairs having COUNT(DISTINCT Location) > 1 */
    SELECT
      Type,
      Color,
      /* Don't actually need to select this value - it could just be in the HAVING */
      COUNT(DISTINCT Location) AS UniqueLocations
    FROM
      MyTable
    GROUP BY Type, Color
    /* Note: Some RDBMS won't allow the alias here and you 
       would have to use the expanded form
       HAVING COUNT(DISTINCT Location) > 1
     */
    HAVING UniqueLocations > 1
  /* JOIN back against the main table on Type, Color */
  ) subq ON MyTable.Type = subq.Type AND MyTable.Color = subq.Color
Run Code Online (Sandbox Code Playgroud)

这是一个演示


fth*_*lla 8

您可以将第一个查询编写为:

Select Type, Color, Count(Distinct Location) As UniqueLocations
From Table
Group By Type, Color
Having Count(Distinct Location) > 1
Run Code Online (Sandbox Code Playgroud)

UniqueLocations(如果您使用 MySQL,则可以在子句中使用别名having,但在许多其他系统上,别名尚不可用,因为子句在子句having之前评估select,在这种情况下,您必须对两个子句重复计数)。

对于第二个,有很多不同的写法,这可能是一种:

Select Distinct Type, Color, Location
From Table
Where
  Exists (
    Select
      *
    From
      Table Table_1
    Where
      Table_1.Type = Table.Type
      and Table_1.Color = Table.Color
    Group By
      Type, Color
    Having
      Count(Distinct Location) > 1
  )
Run Code Online (Sandbox Code Playgroud)