2015-01-26 14 views
9

Aynı kişi her zaman belirli bir tarih aralığı arasında benim tablomda gerçekleşen bulur bir sorgu yazmaya çalışıyorum. Daha sonra bu kişiyi gruplandırır ve harcamalarını belirli bir aralık için toplar. Harcama alışkanlıkları X miktarından fazlaysa, bu tarih için belirtilen tarih aralığı arasında her bir satırı geri gönderin. Sadece gruplandırılmış toplam tutar değil.MySQL - Grup ve toplam, ancak her satırdaki tüm satırları döndürün

SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50 

Bu, doğru toplam alınırken ve 50 $ üzerinde harcama üyelerini dönüyor, fakat her satır: Bu defa ne var. Sadece her üye ve onların toplamı için toplam. Şu anda tüm tabloyu sorguluyordum, henüz tarih aralıkları eklemedim.

+0

mümkün değil. "Grup" olduğunda, o grubun tüm üye satırları tek bir temsilci sırasına indirilir. Orijinal üye satırlarını istiyorsanız, '' grubunu 'kullanamazsınız. –

+0

Kabul. Raporun gerektirdiği gibi alt toplamlar ve dökümler sağlamak için sorgu üzerinde bir uygulama katmanına sahip olmak istediğiniz yer burasıdır. – PaulProgrammer

+1

İlgili satırların tümünü döndürmek için bu alt sorguyu orijinal tablonun "JOIN" yapamazsınız. – Barmar

cevap

14

JOIN orijinal tabloyla bu alt sorgu:

SELECT si1.* 
FROM sold_items AS si1 
JOIN (SELECT member_id 
     FROM sold_items 
     GROUP BY member_id 
     HAVING SUM(amount) > 50) AS si2 
ON si1.member_id = si2.member_id 

genel kural aynı sütunda (ler) tarafından alt sorgu grupları seçme aşamasına oluyor yani ve sonra katılmak olduğunu bize orijinal sorgusuyla aynı sütunları

+0

Bu, sorunumu giderdi görünüyor!Teşekkürler! Ve ben bir JOIN ile böyle bir yuvalanmış select deyimi yazabileceğimi bilmiyordum. Oldukça müthiş. –

+0

Çalışmıyor, tüm yanıtları benim için geri göndermiyor: http://pastebin.com/DhvrmNsq Sorgu, yinelenen sonuçları (aynı aygıt ve aynı zamanda) döndürmeli, ancak 2'den fazla örneğin yinelemelerini özlüyor. – singe3

+1

Alt sorgunuz doğru değil. Sadece tüm kimlikleri değil, her gruptaki kimliklerden birini seçer. Gruplamakta olduğunuz aynı sütunları seçmeniz ve ardından bu sütunları birleştirmede kullanmanız gerekir. – Barmar

0

Aradığınız sonucu alacağınız birkaç sözdizimi vardır, burada bir iç birleştirme kullanarak geri dönen tüm satırların grup tarafından döndürülen listede bir üye_varlığına sahip olmasını ve toplamın her biri için yinelenmesini sağlayın. belli bir üyesi vardır:

SELECT si.*, gb.total from sold_items as si, (SELECT member_id as mid, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) as gb where gb.mid=si.member_id; 
+0

Lütfen cevaplarda örtülü birleşimleri kullanmayın. ANSI birleşimlerini tanıtmaya çalışıyoruz. – Barmar

+0

Özür dilerim, mantıklı. –

1
SELECT member_id, amount 
FROM sold_items si 
INNER JOIN (SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) spenders USING (member_id) 

Zaten oluşturduğunuz sorgu, katılmak için geçici bir tablo olarak kullanılabilir. member_id, tablodaki bir indeks değilse, ölçek ile yavaşlar. Word kullanan kişiler bir tablo takma addır, onun yerine herhangi bir geçerli diğer adı kullanabilirsiniz.

0

ben bu yardımcı olabileceğini düşünmek: Yukarıdaki sorgu

SELECT 
    member_id, 
    SUM(amount) AS amount_value, 
    'TOTAL' as amount_type 
FROM 
    `sold_items` 
GROUP BY 
    member_id 
HAVING 
    SUM(amount) > 50 

UNION ALL 

SELECT 
    member_id, 
    amount AS amount_value, 
    'DETAILED' as amount_type 
FROM 
    `sold_items` 
    INNER JOIN 
    (
     SELECT 
      A.member_id, 
      SUM(amount) AS total 
     FROM 
      `sold_items` A 
     GROUP BY 
      member_id 
     HAVING 
      total <= 50 
    ) AS A 
    ON `sold_items`.member_id = A.member_id 

Sonuçlar aşağıdaki gibi olmalıdır:

member_id  amount_value amount_type 
========================================== 
1    55    TOTAL 
2    10    DETAILED 
2    15    DETAILED 
2    10    DETAILED 

böylece kolon amount_type iki özel üye grupları farklı kılacak

İlgili konular