2012-09-12 33 views
6

Soru 1: aşağıda yapısı ve veri içeren bir tablo vardır:MySQL Pivot/çapraz sorgu

app_id transaction_id mobile_no node_id customer_attribute entered_value 
100  111    9999999999 1  Q1     2        
100  111    9999999999 2  Q2     1        
100  111    9999999999 3  Q3     4        
100  111    9999999999 4  Q4     3        
100  111    9999999999 5  Q5     2        
100  222    8888888888 4  Q4     1        
100  222    8888888888 3  Q3     2        
100  222    8888888888 2  Q2     1        
100  222    8888888888 1  Q1     3        
100  222    8888888888 5  Q5     4        

aşağıda biçimde bu kayıtları görüntülemek istiyorum:

app_id | transaction_id | mobile  | Q1 | Q2 | Q3 | Q4 | Q5 | 
100 |  111   | 9999999999 | 2 | 1 | 4 | 3 | 2 | 
100 |  222   | 8888888888 | 3 | 1 | 2 | 1 | 4 | 

ben Bu ekranı elde etmek için çapraz tablo/pivot sorgu kullanmam gerektiğini biliyorum. Bunun için sahip olduğum sınırlı bilgiye dayanarak denedim.

SELECT app_id, transaction_id, mobile_no, 
    (CASE node_id WHEN 1 THEN entered_value ELSE '' END) AS user_input1, 
    (CASE node_id WHEN 2 THEN entered_value ELSE '' END) AS user_input2, 
    (CASE node_id WHEN 3 THEN entered_value ELSE '' END) AS user_input3, 
    (CASE node_id WHEN 4 THEN entered_value ELSE '' END) AS user_input4, 
    (CASE node_id WHEN 5 THEN entered_value ELSE '' END) AS user_input5 
FROM trn_user_log 
GROUP BY app_id, transaction_id, mobile_no, node_id 

Ve aşağıda ekran var bu sorguya dayalı: Aşağıdaki benim sorgu

app_id transaction_id mobile_no user_input1 user_input2 user_input3 user_input4 user_input5 
100  111    9999999999 2                 
100  111    9999999999    1             
100  111    9999999999       4          
100  111    9999999999           3       
100  111    9999999999              2    
100  222    8888888888 3                 
100  222    8888888888    1             
100  222    8888888888       2          
100  222    8888888888           1       
100  222    8888888888              4    

kimse ben kayıtlara ulaşmak benim sorguya yapmak için gereken uygun değişikliklerle bana yardımcı olabilir tek bir satırda ve yukarıdaki gibi birden fazla satırda değil.

Soru 2: Ayrıca, belirli bir alanın değerini, sütunun ADI olarak almanın bir yolu var. Yukarıda gördüğünüz gibi, başlık olarak user_input1, user_input2, var. Bunun yerine, değerlerin customer_attribute sütunlarının üstbilgisi olarak olmasını istiyorum.

Ben aşağıda NAME_CONST(name,value) kontrol Bunun için

:

SELECT app_id, transaction_id, mobile_no, 
NAME_CONST(customer_attribute, (CASE node_id WHEN 1 THEN entered_value ELSE '' END)) 
FROM trn_user_log 

Ama bu hatayı gerekli

Error Code : 1210 Incorrect arguments to NAME_CONST 

Yardım verir.

cevap

16

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'GROUP_CONCAT((CASE node_id when ', 
     node_id, 
     ' then entered_value else NULL END)) AS user_input', 
     node_id 
    ) 
) INTO @sql 
FROM trn_user_log; 


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
        FROM trn_user_log 
        GROUP BY app_id, transaction_id, mobile_no'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demobkz: sonuç almak için İkincinize göre, ne yapmaya çalıştığınızı açıklığa kavuşturun, net değil.

+0

adam! aklımı okuyorsun ... tam olarak istediğim şeydi ve ben yapıyordum .. Aynısını yapmak için saklanmış bir proc yazıyordum. Çok teşekkürler!!! – DarkKnightFan

+0

@Gaurav sorun değil, ikinci sorunuzu tam olarak anlamadım. – Taryn

+0

evet, bu çok zor .. ve bir SQL'de bile yazabileceğinden şüpheliyim. Bir sütunun değerini "customer_attr" ifadesinin "user_input" yerine üstbilgi olarak gösterilmesini istiyorum. Örneğin, 'Q1', 'user_input1' yerine görüntülenmelidir. Bu kodu java kodunda üstbilgi sütunlarını ayrı ayrı alarak ve aynı şekilde görüntüleyerek halledebileceğimi biliyorum. Ama sadece böyle bir şeyin mümkün olup olmadığını merak ediyorum. Her neyse yardımlarınız için teşekkürler. – DarkKnightFan

7

sizin CASE fıkrada GROUP_CONCAT Ekle John'un statik cevabı size dönüştürmek istediğiniz sütun sayısı bilinmeyen varsa, ben hazırlanmış deyimleri kullanmayı düşünün, büyük eserler @ iken

SELECT app_id, transaction_id, mobile_no, 
    GROUP_CONCAT((CASE node_id WHEN 1 THEN entered_value ELSE NULL END)) AS user_input1, 
    GROUP_CONCAT((CASE node_id WHEN 2 THEN entered_value ELSE NULL END)) AS user_input2, 
    GROUP_CONCAT((CASE node_id WHEN 3 THEN entered_value ELSE NULL END)) AS user_input3, 
    GROUP_CONCAT((CASE node_id WHEN 4 THEN entered_value ELSE NULL END)) AS user_input4, 
    GROUP_CONCAT((CASE node_id WHEN 5 THEN entered_value ELSE NULL END)) AS user_input5 
FROM trn_user_log 
GROUP BY app_id, transaction_id, mobile_no 

SQLFiddle Demo

+0

Söylemediğim için üzgünüm ama işe yaramadı! – DarkKnightFan

+0

@Gaurav neden [SQLFiddle] (http://sqlfiddle.com/#!2/7cbde/4) çalıştı? Grubunuzdaki 'node_id' ibaresini kaldır –

+0

Mükemmel! şimdi çalıştı. Groupby'den 'node_id' kaldırmayı unuttum. İkinci soruma cevap var mı? user_inputx 'yerine' customer_attribute 'değerinin gösterim değeri? – DarkKnightFan

1

@DarkKnightFan, bu, çalıştığım bir görev için çok yardımcı bir soruydu. Ben ikinci soruyu çözmek için bluefin çözümünü değiştirdim. Aşağıdaki kod, orjinal olarak istenen biçimini customer_attribute değeriyle çapraz sekmede ortaya çıkan sütun başlıkları olarak üretir.Buna

' then entered_value else NULL END)) AS user_input', 
     node_id 

:

ilgili değişiklik

değiştirmekti

' then entered_value else NULL END)) AS ''', 
      customer_attribute,'''' 

tam kodu: Ayrıca

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'GROUP_CONCAT((CASE node_id when ', 
     node_id, 
     ' then entered_value else NULL END)) AS ''', 
     customer_attribute,'''' 
    ) 
) INTO @sql 
FROM trn_user_log; 


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
        FROM trn_user_log 
        GROUP BY app_id, transaction_id, mobile_no'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

, Bu sorunu gezen diğer kullanıcılar için eğer Çapraz sekmeye çalıştığınız birçok değer var, GROUP_CONCAT() öğesinin varsayılan değeri olduğundan hatayla karşılaşabilirsiniz. maksimum 1024 karakter uzunluğunda. Bunu artırmak için hazırladığınız ifadenin başlangıcında şunu belirtin:

SET SESSION group_concat_max_len = value; -- replace value with an int