2011-01-06 23 views
32

Bir şeyleri düzleştirmek için biraz yardıma ihtiyacım var, bunun kolay bir soru olduğunu biliyorum, ancak SQL'de biraz kafa karıştırıcı bir şey.GROUP BY/toplu işlev karmaşası SQL'de

Bu SQL sorgusu Oracle'da 'GROUP GROUP ifadesi değil' hatası veriyor. Anladığım kadarıyla, bildiğim gibi, bir tuple özniteliğine göre gruplandırdığımda, artık başka bir özelliğe erişemiyorum.

SELECT * 
FROM order_details 
GROUP BY order_no 

Ancak bu bir yapılan her sipariş için ORDER_DETAILS birden küpe, olduğunu varsayarsak ....

SELECT SUM(order_price) 
FROM order_details 
GROUP BY order_no 

Sadece bu benim anlayış somut işliyor Ben grup dizilerini kez order_no'ya göre, gruptaki her bir tuple için order_price özniteliğine hala erişebiliyorum, ancak sadece bir toplama işlevi kullanıyor olabilirim?

Başka bir deyişle, SELECT deyiminde kullanıldığında toplu işlevler, 'SELECT order_no' ifadesini kullanarak bir hatayı atacak olan 'gizli' öznitelikleri görmek için grubun ayrıntılarını inceleyebilir?

Bunu netleştirmedeki yardımlarınız için teşekkürler, bu soruya Google'da yanıt bulmakta güçlük çektim. Eğer GROUP BY kullandığınızda Chris

cevap

34

standart SQL (ancak MySQL) olarak, siz GROUP BY deyiminde agrega olmayan tüm sonuç sütunları listelemek gerekir. Yani, order_details 6 sütun içeriyorsa, o zaman GROUP BY yan tüm sütunları (ad ile - * GROUP BY veya ORDER BY cümleleri kullanamazsınız) listelemelisiniz.

Ayrıca yapabilirsiniz:

olmayan tüm agrega sütunları GROUP BY deyiminde listelenen çünkü çalışacak
SELECT order_no, SUM(order_price) 
    FROM order_details 
GROUP BY order_no; 

.

Sen gibi bir şey yapabileceğini: Bu sorgu gerçekten anlamlı değildir (veya büyük olasılıkla anlamlı değildir)

SELECT order_no, order_price, MAX(order_item) 
    FROM order_details 
GROUP BY order_no, order_price; 

, ama bu iş 'olacak. Her ayrı sipariş numarasını ve sipariş fiyatı kombinasyonunu listeleyecek ve bu fiyatla ilişkili maksimum sipariş öğesini (sayıyı) verecektir. Bir siparişteki tüm öğeler farklı fiyatlara sahipse, her biri bir satırlık gruplarla sonuçlanırsınız. OTOH, eğer siparişte aynı fiyattan birkaç öğe varsa (her biri 0,99 £), o zaman bunları bir araya getirecek ve bu fiyattan maksimum sipariş kalemi numarasını iade edecektir. (Tabloda, ilk öğenin order_item = 1, ikinci öğe 2, vb. Olduğu (order_no, order_item) numaralı ana anahtarın var olduğunu varsayalım)

+0

Tamam, GROUP BY yürütüldükten sonra, belirli bir order_no için tüm bireysel tuples hala birleştirilmiş işlevler tarafından erişilebilir. Yani, SUM işlevi, bu tuplelar order_no ile birlikte gruplandırılmış olsa bile, her bir tuple'ın order_price özniteliğine erişmeye devam edebilir mi? – Chris

+5

@ Chris: evet, daha fazla veya daha az. Tablodaki satırları gruplara ayırarak GROUP BY'yi düşünebilirsiniz; her grup, GROUP BY deyiminde listelenen sütunlar için aynı değerler kümesine sahiptir. Agregalar daha sonra, gruptaki satırlar üzerinden hesaplanan agrega ile belirtilen sütunlardan herhangi birinde çalışır. Sonuç, GROUP BY sütun değerleri artı ilişkili agregatlarla, grup başına bir satırdan oluşur. Hummm ... Umarım bu berraktır ... –

+0

Evet, söyleyebildiğim kadar tamamen temizledim. Çok teşekkürler Jonathan ve cevap veren diğer adamlara teşekkürler! – Chris

0

Grupla tümce kullanmak için tüm sütunları seçmeniz gerekir. deyim grubuna göre gruplandır, ancak toplama işlevindeki sütunu değil.

Bunu grup yerine bölümleme bölümüyle kullanabilirsiniz, bölümleme olarak gruplamak için yalnızca bir bağlantı noktasını kullanabilirsiniz.

siz de çünkü onun gibi bir şey ile değil grubunu bir hata atma bütün bunlar sütunlarını seçerek Yukarıdaki sorguda 1

0
SELECT * 
FROM order_details 
GROUP BY order_no 

tarafından bölüm olarak yapabilir ..

SELECT * 
    FROM order_details 
    GROUP BY order_no,order_details,etc 

vb o ORDER_DETAILS tablosundan tüm sütunları demektir .. Eğer seçme açıklamada tüm sütunlar maddesi ile grupta olmalıdır hangisi tüm sütunları söz sahip olmasını önlemek için.