2016-03-28 18 views
0

Dolayısıyla, MySQL, 'da birkaç grafik için Query verilerini kullanmayı planlıyorum Grafiklerin verileri aynı tablodan geliyor, ancak birden çok Zaman aralığı için çalışıyor. Yani grup tarafından çalışmıyor.Sayma Satırları Üzerinden Birden Çok Satır ve Sütun

Ben

Total Oranges Mangoes Bananas Tomatoes 
---------------------------------------------- 
19  5  6   7  1 
24  3  7   2  12 
14  3  4   5  2 
20  5  7   6  2 

Şimdi formatında istediğiniz tarihi kendisi kullanıyorum İlk satır alabilirsiniz ya

SELECT 
sum(CASE WHEN Some_Criteria and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END) Total , 
sum(CASE WHEN Some_Other_Criteria and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END) Oranges 
... 
from SomeTable.Table1 
left join OtherTable ON SomeId = OtherId 

VEYA

SELECT 
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Total 
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Oranges 
... 

üzerinden de Alıyorum Ben sadece yukarıdaki yöntemi kullandığım gibi satır kolay olurdu, ama eğer veri birden çok satırda olmak istiyorsa ancak farklı tarih aralıkları?

+3

bir grup bir by' ilk sorgu kullanın. –

+0

, ".. arasında oluşturulduysa, her sütun için eşittir" nerede "maddesine taşıyabilirsiniz –

cevap

0

Bu tarih aralığına bir sonuç kümesinde (bir alt sorgu, geçici bir tablo veya bir çeşit kalıcı bir tablo) ihtiyacınız olacak. Bunu aldıktan sonra, ilk sorgunuzu JOIN ile aralıklar tablonuzda kullanabilir ve daha sonra bu aralıklar üzerinde GROUP BY'u kullanabilirsiniz. Örneğin

:

SELECT 
    DR.start_date, 
    DR.end_date, 
    SUM(CASE WHEN Some_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END) Total, 
    SUM(CASE WHEN Some_Other_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END) Oranges, 
... 
FROM 
    Date_Ranges DR 
INNER JOIN SomeTable.Table1 T1 ON 
    T1.created >= DR.start_date AND 
    T1.created < DR.end_date 
LEFT OUTER JOIN OtherTable OT ON OT.SomeId = T1.OtherId 
GROUP BY 
    DR.start_date, 
    DR.end_date