2016-07-20 2 views
0

Ich habe 2 Tabellen, posbila und posbilb. Das Feld bill_date (Speicher mit dateTime-Format) befindet sich in der Tabelle posbila und das Feld Qty in posbilb.So wählen Sie Daten aller Monate des Benutzers Jahr ausgewählt auch seine leere

Ich habe die Folge Abfrage aber die Monate mit leeren Daten versucht wird nicht

SELECT 
    posbilb.stkcode, 
    SUM(posbilb.qty), 
    date_format(posbila.bill_date, '%m/%y') 

FROM 
    posbila,posbilb 
WHERE 
    posbila.bill_no = posbilb.RECEIVE_ID 

GROUP BY 
    1, 3 

Wenn der Benutzer wählt Jahr 2015 ich folgendes Ergebnis soll gezeigt werden:

Monat | Anzahl
Janury | 154
Februar | 00
März | 123
April | 00
Mai | 00
Juni | 60
Juli | 00
August | 99
September | 00
Oktober | 00
November | 10
Dezember | 00

+2

gegeben Wenn Ihre Tabellen wirklich nicht die fehlenden Termine haben, dann können Sie einen Kalender Tabelle enthalten diese fehlenden Daten verwenden. –

Antwort

0

Wenn Sie keine Datumstabelle haben und keine Erlaubnis haben, eine zu erstellen, können Sie uns verbinden. Zum Beispiel

select * from tbl_loanledger; 
+------+-------------+---------------+---------+---------+--------------+---------+ 
| id | borrower_id | loanmaster_id | payment | balance | date_created | deleted | 
+------+-------------+---------------+---------+---------+--------------+---------+ 
| 1 |   4 |    1 |  50 |  250 | 2016-05-28 |  0 | 
| 2 |   1 |    2 |  20 |  80 | 2016-05-25 |  0 | 
| 3 |   1 |    2 |  30 |  50 | 2016-06-01 |  0 | 
| 4 |   2 |    3 |  100 |  400 | 2016-06-09 |  0 | 
| 5 |   2 |    3 |  50 |  350 | 2016-06-10 |  0 | 
| 6 |   1 |    4 |  50 |  200 | 2016-06-16 |  0 | 
| 7 |   1 |    7 |  50 |  250 | 2016-06-16 |  1 | 
+------+-------------+---------------+---------+---------+--------------+--------+ 

set @yyyy = '2016'; 

select  date_format(s.date_created, '%m/%y') 'mm/yy', sum(s.payment) amount 
from 
(
select 1 as srce,ll.payment payment, ll.date_created date_created from tbl_loanledger ll 
union select 2 ,0, concat(@yyyy,'-01-31') union select 2, 0, concat(@yyyy,'-02-01') union select 2, 0, concat(@yyyy,'-03-31') 
union select 2, 0, concat(@yyyy,'-04-30') union select 2, 0, concat(@yyyy,'-05-31') union select 2, 0, concat(@yyyy,'-06-30') 
union select 2, 0, concat(@yyyy,'-07-31') union select 2, 0, concat(@yyyy,'-07-31') union select 2, 0, concat(@yyyy,'-09-30') 
union select 2, 0, concat(@yyyy,'-10-31') union select 2, 0, concat(@yyyy,'-09-30') union select 2, 0, concat(@yyyy,'-12-31') 
) s 
group  by 1 

Ergebnisse in

+-------+--------+ 
| mm/yy | amount | 
+-------+--------+ 
| 01/16 |  0 | 
| 02/16 |  0 | 
| 03/16 |  0 | 
| 04/16 |  0 | 
| 05/16 |  70 | 
| 06/16 | 230 | 
| 07/16 |  0 | 
| 09/16 |  0 | 
| 10/16 |  0 | 
| 12/16 |  0 | 
+-------+--------+ 
+0

union select 2, 0, concat (@yyyy, '- 01-31') Kann ich wissen, wofür "2, 0," steht? – aWeakProgrammer

+0

, weil ich 2 Spalten mehr aus einer anderen Tabelle auswählen möchte und es scheint, dass meine Abfrage verrückt geworden – aWeakProgrammer

+0

Union hängt Daten aus mehreren SELECT-Anweisungen und erfordert jede select-Anweisung die gleiche Anzahl und Art von Feldern. Die Feldnamen (und Typen in diesem Fall) werden von der ersten Auswahl geerbt, so dass sie in nachfolgenden Auswahlanweisungen nicht erneut angegeben werden müssen. Aus Gewohnheit identifiziere ich normalerweise "echte" Daten mit einem srce-Wert von 1 und "Dummy" -Daten mit einem anderen srce-Wert (in diesem Fall 2) - weil ich zum Beispiel nur echte Daten zählen möchte, den Wert 0 entspricht der Header-Zahlung. –

Verwandte Themen