2017-01-06 3 views
0

Ich arbeite an einer Möglichkeit, die Bestellungsanzahl für Monate in jedem einzelnen Monat in einer bestimmten Zeitspanne und einige andere einschränkende Faktoren anzuzeigen. Hier ist meine Abfrage.SQL-Abfrage für Daten sortiert und nach Monaten gruppiert

SELECT month(o.ord_date) as month, COUNT(o.ord_id) as January, COUNT(o.ord_id) as February, COUNT(o.ord_id) as March, COUNT(o.ord_id) as April, 
COUNT(o.ord_id) as May, COUNT(o.ord_id) as June, COUNT(o.ord_id) as July, COUNT(o.ord_id) as August, COUNT(o.ord_id) as September, 
COUNT(o.ord_id) as October, COUNT(o.ord_id) as November, COUNT(o.ord_id) as December 
FROM hotels h, countries r, cities c, orders o LEFT JOIN trips t ON o.trp_id=t.trp_id 
WHERE o.ord_date>'2016-01-01' AND o.ord_date<'2017-01-05' AND t.spr_id IN ('34','68','53') 
     AND o.htl_id=h.htl_id AND h.ctr_id = r.ctr_id AND h.cty_id = c.cty_id AND r.ctr_id = 245 
GROUP BY month(o.ord_date) 
ORDER BY month ASC 

Ich suche ein Ergebnis in etwa so:

 | Jan | Feb | March | Apr | May | Jun | Jul | Aug | Sept | Oct | Nov | Dec 
Jan  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Feb  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
March | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Apr  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
May  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Jun  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Jul  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Aug  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Sept | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Oct  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Nov  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Dec  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 

Vielen Dank im Voraus.

EDIT: Hier Aufträge Tabellendefinition P.Salmon angefordert:

CREATE TABLE IF NOT EXISTS `orders` (
    `ord_id` int(11) NOT NULL AUTO_INCREMENT, 
    `ord_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `ord_deliv_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `trp_id` int(11) NOT NULL DEFAULT '0', 
    `htl_id` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ord_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=35026 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

hier einige Felder, die zu erklären brauchen würde:

  1. ord_date Zeitpunkt, wenn der Auftrag zuerst
  2. ord_deliv_date Zeitpunkt gemacht wurde wenn die Bestellung geliefert werden soll. In diesem Fall beginnt das Datum, an dem die Fahrt beginnt (referenziert in trp_id).
  3. htl_id ist eine Referenz auf einen Hoteltisch, wo ctr_id und cty_id gespeichert ist.
+1

Betrachten Fragen der Datenanzeige im Anwendungscode Handhabung – Strawberry

+1

Zunächst implizite ersetzen verbindet sich mit expliziten verbindet. –

+0

Können Sie bitte die Tabellendefinition für Bestellungen hinzufügen und einige Beispieldaten. –

Antwort

0

Bedingte Aggregation kann sein, was Sie brauchen. Wenn wir die Verbindungen und Bedingungen ignorieren dann

select month(ord_date), 
sum(case when month(ord_deliv_date) = 1 then 1 else 0 end) as Jan, 
sum(case when month(ord_deliv_date) = 2 then 1 else 0 end) as Feb, 
. 
. 
sum(case when month(ord_deliv_date) = 12 then 1 else 0 end) as Dec 
from orders 
group by month(ord_date) 
+0

Das ist genau das, was ich gesucht habe. Danke mein Herr! – amberbrew

Verwandte Themen