2016-04-01 16 views
0

Bir ürünün, alışveriş seansları boyunca belirli bir ölçüt (veya kombinasyon) üzerinde ne sıklıkta yer aldığını bilmek için bir döngü oluşturma/kullanma konusunda bir sorunum var.Bir PROSEDÜR veya FONKSİYONU olmadan her SELECT ve COUNT için döngü/döngü

Product  | Price_countWhenCheapest | PriceQuality_countWhenHighest | Promotion_countWhenYes | Exclusivity_countWhenYes  
----------------------------------------------------------------------------------------------------------------------------------------- 
ProductA |   0    |   0      |   1    |   1      
ProductB |   0    |   0      |   0    |   2   
ProductC |   1    |   1      |   0    |   0   
ProductD |   1    |   1      |   2    |   0   

Not: Ben istiyorum ne

Session  | Product  | Price | PriceQuality | Promotion | Exclusivity 
----------------------------------------------------------------------------------------------- 
Session1 | ProductA | 50  |  7   | Yes   | No    
Session1 | ProductB | 40  |  6   | No   | Yes 
Session1 | ProductC | 30  |  8   | No   | No 
Session1 | ProductD | 20  |  9   | Yes   | No 
Session2 | ProductA | 30  |  6   | No   | Yes    
Session2 | ProductB | 40  |  7   | No   | Yes 
Session2 | ProductC | 20  |  9   | No   | No 
Session2 | ProductD | 50  |  8   | Yes   | No 

mevcut olduğu her etiket için çıkış bu tür sahip olmaktır:

Bu

Ben mesela benim DB ne var çünkü (Cloud) DB'de SUPER ayrıcalıklarına sahip değilim, bir prosedürü veya işlevi kullanamıyorum.

DÜZENLEME:

  1. Ben sayısı 1 Yukarıdaki (çıkış bakmak) do Bir Oturumun (Session3) ile benim test DB, sütunlar Price_countWhenCheapest ve PriceQuality_countWhenHighest genişletirseniz

    .
  2. Seans hakkında daha fazla bilgiye sahip Müşteri adında ayrı bir tablom var. Örneğin. Müşterinin yaşı veya bu oturumdaki cinsiyet. Bunu çıktıya nasıl dahil edebilirim:
    2.1. Filtre (belki bir WHERE beyanı ile) Sadece 'erkek' Müşteriler olan oturumlar
    2.2. Örneğe bir (alt) sayı ekleyin.

    Testrow_id Session Product Price PriceQuality Promotion Exclusivity 
    1 Session1 ProductA 50 7 Yes No 
    2 Session1 ProductB 40 6 No Yes 
    3 Session1 ProductC 30 8 No No 
    4 Session1 ProductD 20 9 Yes No 
    5 Session2 ProductA 30 6 No Yes 
    6 Session2 ProductB 40 7 No Yes 
    7 Session2 ProductC 20 9 No No 
    8 Session2 ProductD 50 8 Yes No 
    9 Session3 ProductA 30 6 No Yes 
    10 Session3 ProductB 40 7 No Yes 
    11 Session3 ProductC 20 9 No No 
    12 Session3 ProductD 50 8 Yes No 
    
    : Birçok erkek Müşteriler Ürün DB test etmek

Eklendi Session3 (25 bir yaş vardı müşteriler için ve belki de Price_countWhenCheapest_25) En ucuz olan bir Oturumu katıldı öğrenmek için 'Price_countWhenCheapest_male' adlı Price_countWhenCheapest Şimdilik

Çıktı:

Product Price_countWhenCheapest PriceQuality_countWhenHighest Promotion_countWhenYes Exclusivity_countWhenYes 
ProductA 0 0 1 2 
ProductB 0 0 0 3 
ProductC 1 1 0 0 
ProductD 1 1 3 0 

cevap

0

Maalesef MySQL ben bu eğer belirli değilim böylece normalde kullanmayı tercih ediyorum birçok şeyi desteklemez çalışacaktır ancak sen açıklamada altında deneyebilirsiniz:

SELECT 
    Product, 
    CASE WHEN b.Product IS NOT NULL THEN 1 ELSE 0 END AS Price_countWhenCheapest, 
    CASE WHEN c.Product IS NOT NULL THEN 1 ELSE 0 END AS PriceQuality_countWhenHighest, 
    SUM(CASE WHEN Promotion = 'Yes' THEN 1 ELSE 0 END) AS Promotion_countWhenYes, 
    SUM(CASE WHEN Exclusivity = 'Yes' THEN 1 ELSE 0 END) AS Exclusivity_countWhenYes 
FROM tablename a 
LEFT JOIN (
    SELECT DISTINCT Product 
    FROM tablename 
    WHERE Price = (SELECT MIN(Price) FROM tablename) 
) b USING (Product) 
LEFT JOIN (
    SELECT DISTINCT Product 
    FROM tablename 
    WHERE PriceQuality = (SELECT MAX(PriceQuality) FROM tablename) 
) c USING (Product) 
GROUP BY Product, Price_countWhenCheapest, PriceQuality_countWhenHighest 

olsa da, bir kez daha masa daha taramaya gerektirir ve farklı bölümü gerçekten hızlı Bu sorguyu yapmıyor.

JOIN, ürünler arasında 1: 1 ile en ucuz fiyat ve en yüksek fiyat kalitesi ile ilgili bilgileri gruplar halinde değiştirmeyerek grupta yer alabilmesidir. Bir sayıma ihtiyacınız varsa, geri kalanlarla yaptığım gibi SUM() ile sarın ve bu sütunları gruptan çıkarın.

+0

Teşekkürler. Bu çok karmaşık bir ifadedir. Bir deneyeyim ama neyin ne olduğunu anlamaya çalışmak zorundayım. – Dev

+0

Cevabın ilk soruyu çözüp çözmediğini söyleyemediğin sorusunu genişletiyorsun ... –

+0

Üzgünüm, ama 1'de açıklamaya çalıştığım gibi en ucuz prim ve en yüksek fiyat kalitesi yoktu düzgün çalış. Terfi ve özel sayım yaptı. – Dev

İlgili konular