2012-11-06 19 views
11

Bunun için bir yanıt aramıştım ancak bir koşula bağlı olarak bu farklı kayıt kümesini nasıl alacağımı bulamıyorum.SELECT DISTINCT HAVING Sayısız özelliğe sahip hesap sayısı

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 

Ben benzersiz yerlerin sayısı 1'den fazla ise her farklı Type + Renk, örneğin için benzersiz konumların sayısını gösteren bir sorgu oluşturmak istiyorum: Ben aşağıdaki örnek verilerin bulunduğu bir tablo var kırmızı elma (Chicago) için sadece 1 konum olduğundan {Elma, Kırmızı, 1} görünmüyor

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

Not. Sanırım bunu aldım (ama belki de daha basit bir yöntem var). Ben kullanıyorum:

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

Bunu nasıl Type,Color için benzersiz konumların sayısı 1'den büyük olduğu zaman her biri farklı Type,Color için Type, Color ve Location listeler başka bir sorgu oluşturabilir? kırmızı elmaları sadece 1 konum olduğundan

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

Not Apple, Red, Chicago olduğunu görünmüyor: sonuç kayıt gibi görünecektir. Teşekkürler!

cevap

13

bir COUNT(DISTINCT Location) kullanın ve iş yapacak bunları kullanmak çalıştılar olarak Type ve ColorGROUP BY ve HAVING maddeleri üzerinde bir alt sorgu karşı katılmak.

/* 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 

Here is a demonstration

+0

Çok teşekkürler Michael! – vfxdev

3

Buna olarak ilk sorgu yazabilirsiniz:

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

(MySQL kullanıyorsanız size having yan tümcesinde takma UniqueLocations kullanmak, ancak birçok üzerinde olabilir Diğer sistemler having yan tümcesi henüz kullanılabilir değil, select yan tümcesi önce değerlendirilir, bu durumda her iki maddede de yinelenmelidir).

Ve ikincisi için, o yazmak için birçok farklı yolu vardır, bu biri olabilir:

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 
) 
+0

Çok teşekkürler fthiella! – vfxdev

+0

ilk bit çalışmıyor. DBMS'yi kullanıyorsunuz "UniqueLocations" –

+0

@EliPerpinyal'i tanımıyor mu? – fthiella

İlgili konular