sql >> Databasteknik >  >> RDS >> Mysql

Gruppera efter datum, returnera rad även om inga poster hittades

MySQL har inte rekursiv funktionalitet, så du får använda tabelltricket NUMBERS -

  1. Skapa en tabell som bara innehåller ökande siffror - lätt att göra med ett auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. Fyll i tabellen med:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...för så många värden du behöver.

  3. Använd DATE_ADD för att skapa en lista med datum, öka dagarna baserat på värdet NUMBERS.id. Ersätt "2010-01-01" och "2010-03-01" med dina respektive start- och slutdatum (men använd samma format, ÅÅÅÅ-MM-DD) -

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY)
              FROM numbers n
             WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    
  4. LEFT JOIN till din datatabell baserat på datetime-delen:

       SELECT DATE(x.dt) AS dt,
              COALESCE(SUM(e.value), 0) AS sum_value
         FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY) AS dt
                 FROM numbers n
                WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    LEFT JOIN ENTRY e ON DATE(e.datetime) = x.dt
                     AND e.entryid = 85
     GROUP BY DATE(x.dt) 
    

Varför siffror, inte datum?

Enkelt - datum kan genereras baserat på antalet, som i exemplet jag gav. Det innebär också att man använder en enda tabell, jämfört med säg en per datatyp.




  1. Ansluter PowerShell till Salesforce.com

  2. Inlämningsformuläret stannar inte på samma sida

  3. SQL Server 2016:Prestandapåverkan av alltid krypterad

  4. MySQL raderar dubbletter av poster men behåll de senaste