2016-10-11 6 views
-2

ich eine Datenbank haben, die Speicher Datensätze wie:SQL SELECT und nehmen Daten als Spaltenname

+----+---------------------+-------------+-----------------+ 
| id | user_name   |  status|   date | 
+----+---------------------+-------------+-----------------+ 
| 1 | A     |   Paid|  2016-10-11| 
| 2 | B     |  Not Paid|  2016-10-12| 
| 3 | C     |   Paid|  2016-10-12| 
| 4 | A     |  Not Paid|  2016-10-13| 
+----+---------------------+-------------+-----------------+ 

Ich möchte die Ergebnisse wie erhalten:

+----+---------------------+-------------+-----------------+-----------------+ 
| id | user_name   | 2016-10-11|  2016-10-12 |  2016-10-13 | 
+----+---------------------+-------------+-----------------+-----------------+ 
| 1 | A     |   Paid|    NA|   Not Paid| 
| 2 | B     |   NA|   Not Paid|    NA| 
| 3 | C     |   NA|    Paid|    Na| 
+----+---------------------+-------------+-----------------+-----------------+ 

Wie kann ich es Abfrage, um die zu erhalten Ergebnisse wie das?
PS: Schlecht Englisch

Zur Info: Ich bin mit mySQL als als DBMS und hier das Skript erstellen wird:

CREATE TABLE `moneygame`.`pay_table`( 
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `user_name` VARCHAR(50), 
    `status` VARCHAR(50), 
    `p_date` DATE, 
    PRIMARY KEY (`id`) 
); 
+0

Sind die Daten reparieren oder dynamisch? –

+0

Google Pivot Abfrage SQL –

+0

@juergend das Datum ist in dynamischen – Java

Antwort

0

Wenn don abfragen t habe eine feste Anzahl von Daten, dann würde ich nicht empfehlen, zu tun, was Sie versuchen zu tun. Wie auch immer, hier ist die Lösung für das Problem.

create table p as select * from 
(select 1 id, 'A' user_name, 'Paid' status, '2016-10-11' date union 
select 2 id, 'B' user_name, 'Not Paid' status, '2016-10-12' date union 
select 3 id, 'C' user_name, 'Paid' status, '2016-10-12' date union 
select 4 id, 'A' user_name, 'Not Paid' status, '2016-10-13' date) t; 

Wenn Daten werden als Spalten

select user_name, ifnull(max(a),'NA') `2016-10-11`, 
ifnull(max(b),'NA') `2016-10-12`, ifnull(max(c),'NA') `2016-10-13` 
from (select user_name, 
case when date = '2016-10-11' then status else null end a, 
case when date = '2016-10-12' then status else null end b, 
case when date = '2016-10-13' then status else null end c 
from p group by user_name, date) s group by user_name; 

enter image description here

vertreten

Wenn Benutzernamen als Spalten dargestellt werden

Dies sollte optimal sein, wenn Sie eine feste Anzahl von Benutzern und eine wechselnde Datumsauswahl haben.

select date, ifnull(max(a),'NA') A, 
ifnull(max(b),'NA') B, ifnull(max(c),'NA') C from 
(select date, 
case when user_name = 'A' then status else null end a, 
case when user_name = 'B' then status else null end b, 
case when user_name = 'C' then status else null end c 
from p group by date, user_name) x group by date; 

enter image description here

Durch die Art und Weise, wenn Sie noch dynamische Spalten tun müssen, sollten Sie dies lesen:

+0

Was ist, wenn der Benutzer und das Datum weiterhin hinzugefügt werden? – Java

0

Sie mögen dieses ‚

select user_name, max([2016-10-11]) as [2016-10-11], max([2016-10-12]) [2016-10-12],max([2016-10-13]) [2016-10-13] from #yourtable 
pivot 
(max(status) for date in ([2016-10-11],[2016-10-12],[2016-10-13])) p 
group by user_name 
+0

MySQL hat keine Pivot. Sie verwenden wahrscheinlich Oracle. – MontyPython

Verwandte Themen