2015-05-28 13 views
5

İşte tablomda çok basit bir bakış. 1 ve 2 sütunlarım var ve sütun 3 oluşturması gerekiyor. Sütun 3, verilen satır için tümüyle Number için bölünen toplam Number sütununun toplamıdır.Sütun toplamı elde edin ve toplam (mySQL) yüzdesini hesaplamak için kullanın()

| Name   | Number  | % of total | 
| ------------- |:-------------:| -----:  | 
| Bob   | 5    | 25   | 
| Sally   | 10   | 50   | 
| John   | 5    | 25   | 

Ben sayı satır toplam almak ve gerisini hesaplamak için bir değer olarak bu nasıl kullanılacağı ile mücadele ediyorum.

DÜZENLEME: Bunu mümkünse iki ayrı yerine tek bir sorgu gibi yapmak istiyorum. İsterdim,

SELECT Name, Number, Number * 100/(select sum(Number) FROM MYTABLE) AS '% of total' 
FROM mytable 
+0

İkinci sütunların toplam toplamı önceden var mı? – SalmonKiller

+0

@SalmonKiller Hayır, yok. Bu zor kısmı (benim için). Bu değeri almaya çalışıp hepsini bir sorguda kullanın. – jonmrich

cevap

5

sadece SUM()Number sütununu CROSS JOIN gerekir toplamı tutan bir değişkeni saklamakla başlayın, şöyle:

SET @total := (SELECT SUM(number) FROM myTable); 

O değişken vardı keresinde böyle her satır için yüzdesini var bir sorgu çalıştırabilir: bir değişken kullanmak istemiyorsanız

SELECT name, number, (number/@total) * 100 AS percentage 
FROM myTable; 

, sadece o taşıyabilirsiniz senin select deyimi içine alt sorgu:

İşte
SELECT name, number, (number/(SELECT SUM(number) FROM myTable)) * 100 AS percentage 
FROM myTable; 

her yaklaşım ile bir SQL Fiddle örnektir.

+0

Bu benim için çalışıyor ... teşekkürler! Bir soru. Eğer bir WHERE maddesini eklemek istediysem ('WHERE name = "Bob" 'gibi), bu nereye giderdi? Bunu "FROM mytable" 'dan sonra yapmaya çalıştım, ama hatalar aldım. – jonmrich

+0

@jonmrich Filtrelemek istediğiniz şeye bağlıdır. SUM'un uygulandığı satırlar mı? O zaman bunu "CROSS JOIN" in 'SELECT'inde yapmalısınız. Aksi halde 'WHERE'' 'CROSS JOIN''den sonra * yerleştirilmelidir. –

+0

Tahmin edebileceğiniz gibi, aslında masaum bundan daha karmaşıktır. Aynı ada sahip birden çok sütun (aynı kişiyi temsil ediyor) ve bu örneklerin her birini birlikte eklemem gerekiyor (ör., Toplam bob) ve bunu "Number" sütununun toplamına bölerim. Burası asıldığım yer bence. – jonmrich

3

Bir subselect ile alabilirsiniz:

3

bunu yaparken olsaydı:

SELECT Name, Number, Number * 100/t.s AS `% of total` 
FROM mytable 
CROSS JOIN (SELECT SUM(Number) AS s FROM mytable) t 

Demo Here

+0

Hiçbir zaman bir değişken saklamakla çalıştım. Ne kadar süre saklanır? Yazabilir miyim? Bunları ayrı sorgularda çalıştırmam gerekir mi? Birçok soru ... – jonmrich

+1

@jonmrich Eğer yanlışlıkla çalıştırılamıyorlarsa, şimdi düzenlemede görüyorum ki bunu istemeyebilirsiniz. İnanıyorum saklı bir prosedürde daha yararlıdır. Depolandığı süre kadar emin değilim. Sadece şu anki bölümünüz olabilir – AdamMc331

+1

Anladım ... burada geçerli olmasa bile geleceği bilmek iyi bir şey. – jonmrich

İlgili konular