sql >> Database teknologi >  >> RDS >> Mysql

returner tomme rækker for ikke eksisterende data

Du kan gøre noget som nedenstående:

# table creation:drop table if exists test_table;create table test_table (din_dato dato, din_værdi int(11));insert into test_table (din_dato, din_værdi) værdier ('2020-01-01', 1);insert into test_table (din_dato, din_værdi) værdier ('2020-01-01', 2);insert into test_table (din_dato, din_værdi) værdier ('2020-01-03', 2);insert into test_table (din_dato, din_værdi) ) værdier ('2020-01-07', 3);insert into test_table (din_dato, din_værdi) værdier ('2020-01-08', 4);insert into test_table (din_dato, din_værdi) værdier ('2020-01- 08', 1); 

Dette skaber en liste over stort set alle datoerne. Du filtrerer derefter efter de datoer, du er interesseret i, slutter dig til dit bord og din gruppe.

Du kan også erstatte datoerne i where-sætningen med underforespørgsler (min. og maks. dato for din tabel) for at gøre den dynamisk

Det er lidt af en løsning, men det virker.

vælg sbqry.base_date, sum(ifnull(t.your_value, 0))fra (vælg adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i *100 + t1.i*10 + t0.i) base_date from (vælg 0 i union vælg 1 union vælg 2 union vælg 3 union vælg 4 union vælg 5 union vælg 6 union vælg 7 union vælg 8 union vælg 9) t0, ( vælg 0 i fagforening vælg 1 fagforening vælg 2 fagforening vælg 3 fagforening vælg 4 fagforening vælg 5 fagforening vælg 6 fagforening vælg 7 fagforening 8 fagforening vælg 9) t1, (vælg 0 i fagforening vælg 1 fagforening 2 fagforening vælg 3 fagforening vælg 4 fagforening vælg 5 fagforeninger vælg 6 fagforeninger vælg 7 fagforeninger vælg 8 fagforeninger vælg 9) t2, (vælg 0 i fagforening vælg 1 fagforening vælg 2 fagforeninger vælg 3 fagforeninger vælg 4 fagforeninger 5 fagforeninger vælg 6 fagforeninger vælg 7 fagforeninger vælg 8 fagforeninger vælg 9) t3 , (vælg 0 i fagforening vælge 1 fagforening vælge 2 fagforening vælge 3 fagforening vælge 4 fagforening vælge 5 fagforening vælge 6 fagforening vælge 7 fagforening vælge 8 fagforening vælge 9) t4) sbqryleft join test_table t on base_date =t.your_datewhere s bqry.base_date mellem '2020-01-01' og '2020-01-08'gruppe efter sbqry.base_date; 

input:

+------------+------------+| din_dato | din_værdi |+------------+------------+| 01-01-2020 | 1 || 01-01-2020 | 2 || 03-01-2020 | 2 || 2020-01-07 | 3 || 2020-01-08 | 4 || 2020-01-08 | 1 |+------------+------------+

output:

+-------------+------------------------------------- +| basisdato | sum(ifnull(t.din_værdi, 0)) |+------+------------------------ ------+| 01-01-2020 | 3 || 2020-01-02 | 0 || 03-01-2020 | 2 || 04-01-2020 | 0 || 2020-01-05 | 0 || 2020-01-06 | 0 || 2020-01-07 | 3 || 2020-01-08 | 5 |+------------+-------------------------------------+

  1. Brug RAND() i brugerdefineret funktion

  2. Fejlfinding af langvarige forespørgsler i MS SQL Server

  3. Brug af indeks, brug af midlertidig, ved hjælp af filersortering - hvordan løser man dette?

  4. INDSÆT med 10 millioner forespørgsler under 10 minutter i Oracle?