SORU
6 AĞUSTOS 2009, PERŞEMBE


MYSQL - Satır Sütun

Mesaj aramak için denedim, ama ben sadece SQL Server için Erişim çözümleri/buldum. Bir çözüm (5.MYSQL lazım X).

Bir tablo (tarih) denilen 3 sütun var: hostid, itemname, itemvalue. Eğer bir seçin (select * from history) yaparsam dönecektir

1  A  10
1  B  3
2  A  9
2  C  40

Geri dönmek nasıl bir veritabanı sorgu yapmak gibi bir şey

   A    B    C
1  10   3
2  9         40

CEVAP
12 Mart 2012, PAZARTESİ


Bu sorunu çözmek için uygulanması gereken adımlar biraz daha uzun ve daha ayrıntılı bir açıklama eklemek için gidiyorum. Eğer zor geliyorsa özür dilerim.


Verdiğiniz tabanı ile başlar ve bu yazının sonuna kadar kullanacağım açısından bir çift tanımlamak için kullanacağım. Bu olacaktemel tablo:

select * from history;

 -------- ---------- ----------- 
| hostid | itemname | itemvalue |
 -------- ---------- ----------- 
|      1 | A        |        10 |
|      1 | B        |         3 |
|      2 | A        |         9 |
|      2 | C        |        40 |
 -------- ---------- ----------- 

Bu hedefimiz bu olacakgüzel Özet Tablo:

select * from history_itemvalue_pivot;

 -------- ------ ------ ------ 
| hostid | A    | B    | C    |
 -------- ------ ------ ------ 
|      1 |   10 |    3 |    0 |
|      2 |    9 |    0 |   40 |
 -------- ------ ------ ------ 

history.hostid sütundaki değerleri olacaky-değerleriÖzet Tablo. history.itemname sütundaki değerleri olacakx-değerleri(bilinen nedenlerle).


Pivot tablo oluşturma sorunu çözmek için zaman, ben üç-aşamalı bir süreçtir (isteğe bağlı dördüncü adım ile) kullanarak mücadele:

  1. ilgi sütunları, yani seçiny-değerlerivex-değerleri
  2. ekstra sütunlar birer tane ... temel tablo uzatınx-değer
  3. grup ve toplu genişletilmiş tablo, her bir grup vary değeri
  4. (isteğe bağlı) toplu tablo güzelleştirmek başka

Hadi senin sorun için aşağıdaki adımları uygulamak ve nasıl olduğunu görelim:

Adım 1: ilgi sütunları seç. , hostid istenen sonucu sağlary-değerlerive itemname sağlarx-değerleri.

2. adım: fazladan bir sütun temel tablo uzatın. Biz genellikle x-değeri için bir sütun gerekir. X-değer sütun bizim hatırlama itemname:

create view history_extended as (
  select
    history.*,
    case when itemname = "A" then itemvalue end as A,
    case when itemname = "B" then itemvalue end as B,
    case when itemname = "C" then itemvalue end as C
  from history
);

select * from history_extended;

 -------- ---------- ----------- ------ ------ ------ 
| hostid | itemname | itemvalue | A    | B    | C    |
 -------- ---------- ----------- ------ ------ ------ 
|      1 | A        |        10 |   10 | NULL | NULL |
|      1 | B        |         3 | NULL |    3 | NULL |
|      2 | A        |         9 |    9 | NULL | NULL |
|      2 | C        |        40 | NULL | NULL |   40 |
 -------- ---------- ----------- ------ ------ ------ 

Biz sadece ekstra sütunları eklenen satır sayısı -- değiştirmedik unutmayın. Ayrıca not NULLs -- itemname = "A" ile bir satır deseni diğer yeni sütunlar için A ve null değerleri yeni bir sütun için null olmayan bir değer vardır.

Adım 3: grup ve toplam genişletilmiş tablo. Sağladığından dolayı 21**, y değerleri: ihtiyacımız var

create view history_itemvalue_pivot as (
  select
    hostid,
    sum(A) as A,
    sum(B) as B,
    sum(C) as C
  from history_extended
  group by hostid
);

select * from history_itemvalue_pivot;

 -------- ------ ------ ------ 
| hostid | A    | B    | C    |
 -------- ------ ------ ------ 
|      1 |   10 |    3 | NULL |
|      2 |    9 | NULL |   40 |
 -------- ------ ------ ------ 

(Artık-değeri y başına bir satır yoktur.)Tamam, az kaldı! Biz sadece bu çirkin kurtulmak gerekir NULLler.

Adım 4: güzelleştirmek başka. Sadece sıfır ile herhangi bir null değerleri değiştirmek için gidiyoruz sonuç kümesi bakmak için daha hoş.

create view history_itemvalue_pivot_pretty as (
  select 
    hostid, 
    coalesce(A, 0) as A, 
    coalesce(B, 0) as B, 
    coalesce(C, 0) as C 
  from history_itemvalue_pivot 
);

select * from history_itemvalue_pivot_pretty;

 -------- ------ ------ ------ 
| hostid | A    | B    | C    |
 -------- ------ ------ ------ 
|      1 |   10 |    3 |    0 |
|      2 |    9 |    0 |   40 |
 -------- ------ ------ ------ 

Ve, güzel bir özet güzel bir tablo MySQL kullanılarak inşa ettik işimiz bitti.


Bu prosedürü uygularken dikkat edilmesi gereken noktalar:

  • ekstra sütunları kullanın. Bu örnekte itemvalue kullandım
  • ne "tarafsız" ekstra sütunları kullanmaya değer. Ama aynı zamanda 0 "" tam durumunuza bağlı olabilir NULL kullandım
  • toplama gruplama yaparken kullanmak için işlev. Kullandım sum ama count max da sık sık kullanılan (max sık kullanılan bina tek satır "nesneleri" olmuştu yayılmış birçok satır)
  • y-değerleri için birden çok sütun kullanarak. Bu çözüm y-değerler -- group by fıkra içine ekstra sütunları tak (select bunları unutma) için tek bir sütun kullanarak sınırlı değil

Bilinen sınırlamalar:

  • bu çözüm, her pivot sütun temel tablo uzanan el ile eklenmesi gerekir Özet Tablo n sütunlar -- izin vermez. 5 veya 10 x değerleri için, bu çözüm güzel. 100, o kadar da iyi değil. Saklı yordamları bir sorgu oluşturma ile bazı çözümler var, ama sağ olsun çirkin zor. Ben şu anda pivot çok sayıda sütun olması gerekir, bu sorunu çözmek için iyi bir yol bilmiyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • jpmkm1

    jpmkm1

    4 NİSAN 2008
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010