21

私はこれについての答えを探しましたが、条件に基づいてこの明確なレコードセットを取得する方法を見つけることができません。次のサンプルデータを含むテーブルがあります。

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

一意の場所の数が1を超える、個別のType+Colorごとの一意の場所の数を表示するクエリを作成したいと思います。

Type    Color   UniqueLocations
----    -----   --------
Apple   Green   2
Banana  Yellow  2

赤いリンゴ(シカゴ)の場所は1つしかないため、{Apple、Red、1}は表示されないことに注意してください。私はこれを持っていると思います(しかし、おそらくもっと簡単な方法があります)。私が使用しているもの:

SELECT Type, Color, Count(Location) FROM
(SELECT DISTINCT Type, Color, Location FROM MyTable)
GROUP BY Type, Color HAVING Count(Location)>1;

の一意の場所の数が1より大きい場合にType, Color、をリストするLocation別のクエリを作成するにはどうすればよいですか?結果のレコードセットは次のようになります。Type,ColorType,Color

Type    Color   Location
----    -----   --------
Apple   Green   New York
Apple   Green   Los Angeles
Banana  Yellow  Miami
Banana  Yellow  Atlanta

Apple, Red, Chicago赤いリンゴの場所は1つしかないため、表示されないことに注意してください。ありがとう!

4

2 に答える 2

23

とのCOUNT(DISTINCT Location)サブクエリに対してaとjoinを使用し、それらを使用しようとしたときにandType句が機能します。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

これがデモンストレーションです

于 2012-11-06T20:02:22.957 に答える
4

最初のクエリは次のように記述できます。

Select Type, Color, Count(Distinct Location) As UniqueLocations
From Table
Group By Type, Color
Having Count(Distinct Location) > 1

(MySQLを使用している場合は、句でエイリアスUniqueLocationsを使用できますが、他の多くのシステムでは、句が句の前に評価されるためhaving、エイリアスはまだ使用できません。この場合、両方の句でカウントを繰り返す必要があります)。havingselect

そして2番目のものについては、それを書くための多くの異なる方法があります、これは1つである可能性があります:

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
  )
于 2012-11-06T20:05:57.340 に答える