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
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:
- ilgi sütunları, yani seçiny-değerlerivex-değerleri
- ekstra sütunlar birer tane ... temel tablo uzatınx-değer
- grup ve toplu genişletilmiş tablo, her bir grup vary değeri
- (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 NULL
s -- 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 NULL
ler.
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ı olabilirNULL
kullandım - toplama gruplama yaparken kullanmak için işlev. Kullandım
sum
amacount
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.
MySQL: bir Dönen birden çok sütun-satı...
MYSQL - Satır Sütun...
MySQL 600 K satır 10 rastgele satır hı...
MySQL ile nasıl bir sütun tablo içinde...
İkinci tablo fazladan bir sütun olması...