sql >> Database teknologi >  >> RDS >> Oracle

Oracle:Få data om alle måneder, 0 hvis ingen data

Meget lig eksisterende svar, men dette:

vælg months.month, mv.mycost, coalesce(mv.mynumber, 0) som mynumberfrom ( select to_char(dato '1970-01-01' + numtoyminterval(niveau - 1, 'month'), ' mm') som måned fra dual connect efter niveau <=12) monthsleft join myoracle_mv mvon mv.month =months.monthorder by months.month, mv.mycost, mv.mynumber; 

giver dette med de data, du har sendt:

MÅNED MYCOST MYNUMBER----- ------ ----------01 AAA 3777.24 01 BBB 18811 01 CCC 3845.47 02 AAA 49973.12 02 BBB 29872.67 02 CCC 4 3050 4049.91 03 BBB 29068.55 03 CCC 3784.44 03 DDD 107.07 04 AAA 469.485 04 BBB 264957.8 04 CCC 799.73 04 DDD 181.78 05 AAA 5872.22 05 BBB 67673 05 CCC 124884.2 05 DDD 110.09 06 AAA 65837.71 06 BBB 855.02 06 CCC 5157.24 06 DDD 18016.19 07 AAA 566.23 07 BBB 5226.1 07 CCC 19184.78 07 DDD 1772.95 08 AAA 18432.95 08 BBB 2663.24 08 CCC 2280.05 08 DDD 63.32 09 0 10 431 AAA 5. 5 10 31 5. 5. 5 10 31 AA 5. 5 10 4 0 31 AA 

Hvis du vil have et nul vist i mit nummer kolonne, så kan du lave det:

vælg months.month, mv.mycost, coalesce(mv.mynumber, 0) som mitnummer 

hvilket giver:

...08 DDD 63.32 09 0 10 0 11 0 12 AAA 4337.75 ...

Ud fra kommentarerne til Jafars svar lyder det, som om du måske var nået så langt alene, men du vil have nul værdier for alle mycost værdier for alle måneder. Hvis det er tilfældet, skal du hente listen over mulige værdier for mycost og ydre sammenføjning dertil. Dette tager alle værdier, der allerede er i MV:

vælg months.month, cost.mycost, coalesce(mv.mynumber, 0) as mynumberfrom ( select to_char(dato '1970-01-01' + numtoyminterval(niveau - 1, 'month'), ' mm') som måned fra dual connect efter niveau <=12) monthscross join (vælg distinkt mycost fra myoracle_mv) costleft join myoracle_mv mvon mv.month =months.month mv.mycost =cost.mycostorder by months.month, cost.mycost, mv.mitnummer; 

og giver:

MÅNED MYCOST MIT NUMMER----- ------ ----------01 AAA 3777.24 01 BBB 18811 01 CCC 3845.47 01 DDD 0 02 AAA 49973.12 02 BBBCC 29872.67 02 C 3050.54 02 DDD 0 03 AAA 4049.91 03 BBB 29068.55 03 CCC 3784.44 03 DDD 107.07 04 AAA 469.485 04 BBB 264957.8 04 CCC 799.73 04 DDD 181.78 05 AAA 5872.22 05 BBB 67673 05 CCC 124884.2 05 DDD 110.09 06 AAA 65837.71 06 BBB 855.02 06 CCC 5157.24 06 DDD 18016.19 07 AAA 566.23 07 BBB 5226.1 07 CCC 19184.78 07 DDD 1772.95 08 AAA 18432.95 08 BBB 2663.24 08 CCC 2280.05 08 DDD 63.32 09 AA 09 BBB 09 CC 09 DD 0 11 AAA 0 11 BBB 0 11 CCC 0 11 DDD 0 12 AAA 4337.75 12 BBB 5490.58 12 CCC 0 12 DDD 0 48 rækker valgt

Men forhåbentlig har du en anden tabel, der indeholder de mulige mycost værdier (hvis det antages, at det repræsenterer noget som et omkostningssted, snarere end en pris; lidt svært at sige, hvad der er hvad), og du kan bruge det i stedet for underforespørgslen.

SQL Fiddle .

Bemærk også, at hvis du ville tilføje et filter, f.eks. for at begrænse data til et bestemt år, skal du gøre det i venstre join klausul, ikke som en where klausul, eller du vil vende den ydre sammenføjning til en indre. For eksempel tilføj dette :

hvor mv.år =2011 

ville betyde, at du kun fik to rækker tilbage:

MÅNED MYCOST MYNUMBER----- ------ ----------12 AAA 4337.75 12 BBB 5490.58  

Men hvis du opgav en anden betingelse på den ydre joinforbindelse du vil stadig få 48 rækker tilbage, hvor 46 af dem har nuller og to har værdierne ovenfor:

...venstre join myoracle_mv mvon mv.month =months.month mv.mycost =cost.mycostand mv.year =2011bestil efter months.month, cost.mycost, mv.mynumber;...11 CCC 0 11 DDD 0 12 AAA 4337.75 12 BBB 5490.58 12 CCC 0 12 DDD 0 48 rækker valgt  


  1. Hvordan indsætter man en række i en tabel, der kun har en enkelt autoincrement-kolonne?

  2. Ændring og lagring af mysql-brugerdata i en visningstabel, som viser en brugers data

  3. Sådan konverteres tal til ord - ORACLE

  4. Fejl opstår kun efter udgivelse:Kan ikke oprette forbindelse til nogen af ​​de angivne MySQL-værter.