2016-04-26 2 views
4

beworben haben Entschuldigung für den verwirrenden Titel, was ich versuche zu erreichen ist, die gesamten Bewerbungen für einen Job über die folgende Tabelle zu erhalten:Der prozentuale Anteil von Männern/Frauen, die sich für einen Job mit einer Altersspanne von

CREATE TABLE IF NOT EXISTS `applications` (
    `application_id` int(11) NOT NULL AUTO_INCREMENT, 
    `application_user` varchar(100) NOT NULL, 
    `application_date` datetime NOT NULL, 
    `application_job` int(11) NOT NULL, 
    `application_status` varchar(10) DEFAULT 'pending', 
    `application_enabled` int(2) NOT NULL DEFAULT '1', 
    `application_resume` int(11) NOT NULL, 
    `application_description` text NOT NULL, 
    PRIMARY KEY (`application_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

um ihr Alter zu erhalten, bin ich links Beitritt user_personal_information auf application_user, weil sie der Benutzer sind, der auf einen Job angewendet hat. Meine Frage:

SELECT count(*) as total, 
     user_gender as gender, 
     TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) AS age, 
     application_date 
FROM applications 
LEFT JOIN user_personal_information 
    ON user_personal_information_user = application_user 
WHERE application_job = ? 

Tabelle Mein Benutzers mit user_gender, die male/female und user_birthdate, die in der obigen Aussage gleich kann ich es zu einem Alter bin zu konvertieren.

ich alle zu einer Gruppe bin versucht, die Anwendungen mit einem Alter von zum Beispiel:

16 - 21 
22 - 30 
31 - 45 
45 - 64 
65+ 

Und die männlichen und weiblichen Prozentsätze für das Alter. Um sich für einen Datachart zu verwenden, die Daten wie so braucht:

"dataProvider": [ 
{ 
    "age": "85+", 
    "male": 25, // 
    "female": 25 
}, { 
    "age": "80-54", 
    "male": 25,//percentage 
    "female": 25//percentage 
}] 

So von oben, gibt es 25% der Männer im Alter von 85 angewendet haben und älter, und 25% der Frauen. Du bekommst das Wesentliche, also versuche ich, meine Select-Anweisung zum Laufen zu bringen.

, die ein Diagramm wie so schaffen:

enter image description here

Also nur zu klären, möchte ich die Gesamt Anwendungen zählen und den Prozentsatz der Anwendungen, die auf Geschlecht und Altersgruppen auf Basis erarbeiten. Wie kann ich das mit der obigen select-Anweisung tun?

Antwort

1

Ein paar verschachtelte Group-by-Unterabfragen können das für Sie erledigen. Beachten Sie, dass der Prozentsatz berechnet ist geschlechtsspezifisch:

select a.age, a.gender, a.cnt, 100*a.cnt/b.sm as percentage from 
    (
     SELECT user_gender as gender, 
       TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) AS age, 
       count(*) as cnt, 
     FROM applications 
     LEFT JOIN user_personal_information 
     ON user_personal_information_user = application_user 
     WHERE application_job = ? 
     GROUP BY user_gender, TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) 
    ) a, 
    (
     SELECT TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) AS age, 
       count(*) as sm 
     FROM applications 
     LEFT JOIN user_personal_information 
     ON user_personal_information_user = application_user 
     WHERE application_job = ? 
     GROUP BY TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) 
    ) b 
    where a.age = b.age; 

Wenn Sie für einen bestimmten Prozentsatz spezifischen Gesamt Anwendungen suchen, müssen Sie so etwas wie:

select a.age, 
     a.gender, 
     a.cnt, 
100*a.cnt/(
      select count(TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE())) 
      from 
      applications 
      LEFT JOIN user_personal_information 
      ON user_personal_information_user = application_user 
      WHERE application_job = ? 
     ) as percentage 
from 
    (
     SELECT user_gender as gender, 
       TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) AS age, 
       count(*) as cnt, 
     FROM applications 
     LEFT JOIN user_personal_information 
     ON user_personal_information_user = application_user 
     WHERE application_job = ? 
     GROUP BY user_gender, TIMESTAMPDIFF(YEAR, user_birthdate, CURDATE()) 
    ) a; 
+0

Sorry, ich habe versucht, den Prozentsatz auch zu bekommen und die Altersspanne anzeigen dh (40-50) – 4334738290

+0

müssen eine 'case when' Aussage über das berechnete Alter verwenden, um sie auf Gruppen zu beschränken (zB 16-21 etc.) & dann gro von diesem als auch Geschlecht –

+0

Ich habe mich entschieden, zwei Gruppen zu verschachteln und auf die Beute ihres Joins abzufragen. Ich denke, es wird funktionieren. – Spade

0

Dies sollte die Arbeit machen:

 
select 
sum(case when age between 16 and 21 and gender='male' then 1 end) as '[Male 16-21]', 
sum(case when age between 16 and 21 and gender='female' then 1 end) as 'Female [16-21]', 
sum(case when age between 22 and 30 and gender='male' then 1 end) as '[Male 22-30]', 
sum(case when age between 22 and 30 and gender='female' then 1 end) as '[Female 22-30]', 
sum(case when age between 31 and 45 and gender='male' then 1 end) as '[Male 31-45]', 
sum(case when age between 31 and 45 and gender='female' then 1 end) as '[Female 31-45]', 
sum(case when age between 46 and 64 and gender='male' then 1 end) as '[Male 46-64]', 
sum(case when age between 46 and 64 and gender='female' then 1 end) as '[Female 46-64]', 
sum(case when age > 64    and gender='male' then 1 end) as '[Male Over 64]', 
sum(case when age > 64    and gender='female' then 1 end) as '[Female Over 64]', 
sum(case when 1=1     and gender='female' then 1 end) as '[Male TOTAL]', 
sum(case when 1=1     and gender='male' then 1 end) as '[Female TOTAL]' 

FROM applications 
Verwandte Themen