MySQL Pivot: umiikot na mga hilera sa mga haligi

Mysql Pivot Rotating Rows Columns



Ang isang talahanayan ng database ay maaaring mag-imbak ng iba't ibang mga uri ng data at kung minsan kailangan naming ibahin ang data sa antas ng hilera sa data ng antas ng haligi. Maaaring malutas ang problemang ito sa pamamagitan ng paggamit ng function na PIVOT (). Ang pagpapaandar na ito ay ginagamit upang paikutin ang mga hilera ng isang talahanayan sa mga haligi ng haligi. Ngunit ang pagpapaandar na ito ay sinusuportahan ng napakakaunting mga database server, tulad ng Oracle o SQL Server. Kung nais mong gawin ang parehong gawain sa talahanayan ng database ng MySQL pagkatapos ay kailangan mong isulat ang SELECT query gamit ang pahayag ng KASO upang paikutin ang mga hilera sa mga haligi. Ipinapakita ng artikulo ang paraan upang gawin ang gawain ng pag-andar ng PIVOT () sa loob ng mga nauugnay na mga talahanayan ng database ng MySQL.

Pangangailangan:

Kailangan mong lumikha ng isang database at ilang kaugnay na mga talahanayan kung saan ang mga hilera ng isang talahanayan ay mai-convert sa mga haligi tulad ng pag-andar ng PIVOT (). Patakbuhin ang mga sumusunod na pahayag ng SQL upang lumikha ng isang database na pinangalanang ' unidb 'At lumikha ng tatlong mga talahanayan na pinangalanang' mag-aaral ',' kurso 'At' resulta '. mag-aaral at resulta ang mga talahanayan ay maiuugnay sa pamamagitan ng isa-sa-maraming ugnayan at kurso at mga resulta ang mga talahanayan ay maiuugnay sa pamamagitan ng isa-sa-maraming ugnayan dito. GUMAWA ng pahayag ng resulta Naglalaman ang talahanayan ng dalawang banyagang pangunahing mga hadlang para sa mga patlang, std_id , at kurso_id .







GUMAWA NG DATABASE unidb;
GAMITIN ang unidb;

GUMAWA NG mga mag-aaral ng TABLE(
idINT PRIMARY KEY,
pangalan ng varchar(limampu)HINDI NULO,
departamento VARCHAR(labinlimang)HINDI NULL);

GUMAWA NG mga kurso sa TABLE(
course_id VARCHAR(dalawampu)PANGUNAHING SUSI,
pangalan ng varchar(limampu)HINDI NULO,
credit SMALLINT HINDI Null);

GUMAWA ng resulta sa TABLE(
std_id INT NOT NULL,
course_id VARCHAR(dalawampu)HINDI NULO,
mark_type VARCHAR(dalawampu)HINDI NULO,
marka ang SMALLINT HINDI NULL,
DAYUHANG SUSI(std_id)Sanggunian mga mag-aaral(id),
DAYUHANG SUSI(kurso_id)Mga kurso na Sanggunian(kurso_id),
PANGUNAHING SUSI(std_id, course_id, mark_type));

Ipasok ang ilang mga talaan sa mga mag-aaral, kurso at resulta mga mesa Ang mga halaga ay dapat na ipasok sa mga talahanayan batay sa mga paghihigpit na itinakda sa oras ng paggawa ng talahanayan.



Ipasok SA mga mag-aaral VALUES
( '1937463','Harper Lee','CSE'),
( '1937464','Garcia Marquez','CSE'),
( '1937465','Forster, E.M.','CSE'),
( '1937466','Ralph Ellison','CSE');

Ipasok sa mga VALUES ng kurso
( 'CSE-401','Object oriented na programa',3),
( 'CSE-403','Istraktura ng Data',2),
( 'CSE-407','Unix programming',2);

Ipasok sa mga VALUES ng resulta
( '1937463','CSE-401','Panloob na Pagsusulit',labinlimang),
( '1937463','CSE-401','Mid Term Exam',dalawampu),
( '1937463','CSE-401','Huling pagsusulit',35),
( '1937464','CSE-403','Panloob na Pagsusulit',17),
( '1937464','CSE-403','Mid Term Exam',labinlimang),
( '1937464','CSE-403','Huling pagsusulit',30),
( '1937465','CSE-401','Panloob na Pagsusulit',18),
( '1937465','CSE-401','Mid Term Exam',2. 3),
( '1937465','CSE-401','Huling pagsusulit',38),
( '1937466','CSE-407','Panloob na Pagsusulit',dalawampu),
( '1937466','CSE-407','Mid Term Exam',22),
( '1937466','CSE-407','Huling pagsusulit',40);

Dito, resulta Naglalaman ang talahanayan ng maraming magkaparehong halaga para sa std_id , mark_type at kurso_id mga haligi sa bawat hilera. Paano i-convert ang mga hilera na ito sa mga haligi ng talahanayan na ito para sa pagpapakita ng data sa isang mas organisadong format ay ipinapakita sa susunod na bahagi ng tutorial na ito.



Paikutin ang mga hilera sa mga haligi gamit ang pahayag ng CASE:

Patakbuhin ang sumusunod na simpleng piling pahayag upang ipakita ang lahat ng mga tala ng resulta mesa





PUMILI*MULA sa resulta;

Ipinapakita ng output ang marka ng apat na mag-aaral para sa tatlong uri ng pagsusulit ng tatlong kurso. Kaya ang mga halaga ng std_id , kurso_id at mark_type ay paulit-ulit na maraming beses para sa iba't ibang mga mag-aaral, kurso at uri ng pagsusulit.



Ang output ay magiging mas nababasa kung ang SELECT query ay maaaring maisulat nang mas mahusay sa pamamagitan ng paggamit ng pahayag ng KASO. Ang sumusunod na PUMILI sa pahayag ng KASO ay magbabago ng paulit-ulit na mga halaga ng mga hilera sa mga pangalan ng haligi at ipapakita ang nilalaman ng mga talahanayan sa isang mas nauunawaan na format para sa gumagamit.

SELECT resulta.std_id, resulta.course_id,
MAX(KASO KAPAG resulta.mark_type ='Panloob na Pagsusulit'TAPOS resulta.marka END) 'Panloob na Pagsusulit',
MAX(KASO KAPAG resulta.mark_type ='Mid Term Exam'TAPOS resulta.marka END) 'Mid Term Exam',
MAX(KASO KAPAG resulta.mark_type ='Huling pagsusulit'TAPOS resulta.marka END) 'Huling pagsusulit'
MULA sa resulta
GROUP NG resulta.std_id, resulta.course_id
NG ORDER NG resulta.std_id, resulta.course_id ASC;

Ang sumusunod na output ay lilitaw pagkatapos patakbuhin ang pahayag sa itaas na mas nababasa kaysa sa nakaraang output.

Paikutin ang mga hilera sa mga haligi gamit ang CASE at SUM ():

Kung nais mong bilangin ang kabuuang bilang ng bawat kurso ng bawat mag-aaral mula sa talahanayan pagkatapos ay kailangan mong gamitin ang pinagsamang pagpapaandar SUM () pangkat ng std_id at kurso_id kasama ang pahayag ng KASO. Ang sumusunod na query ay nilikha sa pamamagitan ng pagbabago ng nakaraang query gamit ang SUM () function at GROUP BY clause.

PILIHING resulta.std_id, resulta.course_id,
MAX(KASO KAPAG resulta.mark_type ='Panloob na Pagsusulit'TAPOS resulta.marka END) 'Panloob na Pagsusulit',
MAX(KASO KAPAG resulta.mark_type ='Mid Term Exam'TAPOS resulta.marka END) 'Mid Term Exam',
MAX(KASO KAPAG resulta.mark_type ='Huling pagsusulit'TAPOS resulta.marka END) 'Huling pagsusulit',
SUM(resulta.marka) bilangKabuuan
MULA sa resulta
GROUP NG resulta.std_id, resulta.course_id
NG ORDER NG resulta.std_id, resulta.course_id ASC;

Nagpapakita ang output ng isang bagong haligi na pinangalanan Kabuuan ipinapakita ang kabuuan ng mga marka ng lahat ng uri ng pagsusulit ng bawat kurso na nakuha ng bawat partikular na mag-aaral.

Paikutin ang mga hilera sa mga haligi sa maraming mga talahanayan:

Ang nakaraang dalawang query ay inilalapat sa resulta mesa Ang talahanayan na ito ay nauugnay sa iba pang dalawang mga talahanayan. Ito ay mag-aaral at kurso . Kung nais mong ipakita ang pangalan ng mag-aaral sa halip na mag-aaral id at pangalan ng kurso sa halip na kurso id pagkatapos ay kailangan mong isulat ang SELECT query gamit ang tatlong nauugnay na mga talahanayan, mag-aaral , kurso at resulta . Ang sumusunod na SELECT query ay nilikha sa pamamagitan ng pagdaragdag ng tatlong mga pangalan ng talahanayan pagkatapos ng form na FORM at pagtatakda ng mga naaangkop na kundisyon sa WHERE clause upang kunin ang data mula sa tatlong mga talahanayan at makabuo ng mas naaangkop na output kaysa sa mga nakaraang SELECT query.

PUMILI ng mga mag-aaral.pangalanbilang 'Pangalan ng estudyante', mga kurso.pangalanbilang 'Pangalan ng Kurso',
MAX(KASO KAPAG resulta.mark_type ='Panloob na Pagsusulit'TAPOS resulta.marka END) 'CT',
MAX(KASO KAPAG resulta.mark_type ='Mid Term Exam'TAPOS resulta.marka END) 'Mid',
MAX(KASO KAPAG resulta.mark_type ='Huling pagsusulit'TAPOS resulta.marka END) 'Pangwakas',
SUM(resulta.marka) bilangKabuuan
MULA sa mga mag-aaral, kurso, resulta
SAAN ang resulta.std_id = mag-aaral.id at resulta.course_id = kurso.course_id
GROUP NG resulta.std_id, resulta.course_id
NG ORDER NG resulta.std_id, resulta.course_id ASC;

Ang sumusunod na output ay bubuo pagkatapos maipatupad ang query sa itaas.

Konklusyon:

Paano mo maipapatupad ang pagpapaandar ng pag-andar ng Pivot () nang walang suporta ng pagpapaandar ng Pivot () sa MySQL ay ipinapakita sa artikulong ito sa pamamagitan ng paggamit ng ilang datos ng dummy. Inaasahan kong, mabago ng mga mambabasa ang anumang data sa antas ng hilera sa data ng antas ng haligi sa pamamagitan ng paggamit ng SELECT query pagkatapos basahin ang artikulong ito.