2017-05-12 2 views
0

Ich entwickle eine WebApp und ich sende Filter zu meiner Datenbank im Backend. Ich benutze mySql als Datenbank. Und was würde Ich mag es, erreichen:Zählen in Unterabfrage SELECT-Anweisung mit WHERE und GroupBy

Zählen wie viele Nachrichten, bei denen gesendet (count (mailid) aus Tabelle)

Graf, wie viel der gesendeten Nachricht einen Status empfing (Status wird aus der Tabelle NOT NULL). Ich weiß nicht, wie diese

zu erreichen, um die GROUP BY im Sinne zum Beispiel sein kann

SELECT formName 
     , language 
     , COUNT(mailid) AS totalsent 
     , .... as totalfeedback 
    FROM mytable 
    WHERE formName in ('Z_4') 
    AND language in ('F','N') 
    AND sendingdate BETWEEN '2017-04-01' AND '2017-04-30' 
    AND returndate BETWEEN '2017-04-01' AND '2017-04-30' 
    GROUP 
    BY formName 
     , language 

Ergebnis unter:

formname language  totalSent  FeedBackReceived 
XXXX_Z984 F   9306    9120 

XXXX_Z984 N   11337     10500 

Das ist mein Tisch ist:

 CREATE TABLE `mytable` (
    `id` int(25) NOT NULL AUTO_INCREMENT, 
    `formName` varchar(100) DEFAULT NULL, 
    `mode` varchar(30) DEFAULT NULL, 
    `language` varchar(30) DEFAULT NULL, 
    `sendingDate` date DEFAULT NULL, 
    `telnumber` varchar(30) DEFAULT NULL, 
    `segment` varchar(30) DEFAULT NULL, 
    `status` varchar(45) DEFAULT NULL, 
    `mailId` varchar(45) DEFAULT NULL, 
    `returnDate` date DEFAULT NULL, 
    `returnTime` varchar(45) DEFAULT NULL, 
    `url` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `mailid_idx` (`mailId`) USING HASH, 
    KEY `formname_idx` (`formName`), 
    KEY `type_idx` (`mode`), 
    KEY `language_idx` (`language`), 
    KEY `email_idx` (`email`), 
    KEY `status_idx` (`status`) 
) ENGINE=InnoDB AUTO_INCREMENT=820396 DEFAULT CHARSET=latin1; 

Antwort

1

Aggregatfunktionen wie count übernehmen Nicht-Null-Werte berücksichtigen.

So ein Ausdruck wie count(status) alle Nicht-Null-Werte von Attribute status in der jeweiligen Gruppe zählen:

select formName, language, count(mailid) as totalsent, count(`status`) as totalfeedback 
FROM mytable 
where language in ('F','N') 
AND sendingdate BETWEEN '2017-04-01' AND '2017-04-30' 
AND returndate BETWEEN '2017-04-01' AND '2017-04-30' 
group by formName,language 

Wenn Sie zusätzlich status nur diejenigen (nicht null) zu zählen, haben zu prüfen - Werte von Datensätzen, in denen mailid nicht null ist, dann könnten Sie schreiben:

select formName, language, count(mailid) as totalsent, count(if(mailid is null, null, `status`)) as totalfeedback 
FROM mytable 
where language in ('F','N') 
AND sendingdate BETWEEN '2017-04-01' AND '2017-04-30' 
AND returndate BETWEEN '2017-04-01' AND '2017-04-30' 
group by formName,language 
Verwandte Themen