none
Vnořeny select s group by

    Dotaz

  • Zdravím,

    prosím o radu s níže uvedeným selectem.

    Potřebuji v něm zobrazit několik polí s hodnotami SUM mozstvi_vyd za skupinu karty a to několik sloupců za -90 za -180 a za -360dní.

    Dokážu to jen s jedním polem a při vnořeném selectu mi to nebere Group by a zobrazují se mi tak hodnoty za celé pole.

     

    SELECT
        dba.vl_polozky.ID_KARTY,
        max(dba.vl_polozky.KARTA) AS KARTA,
        max(dba.vl_polozky.NAZEV) AS NAZEV,
        sum(dba.vl_polozky.MNOZSTVI_VYD) AS VYDEJ
      FROM
        dba.vl_zahlavi
        INNER JOIN dba.vl_polozky ON (dba.vl_zahlavi.DOKLAD = dba.vl_polozky.DOKLAD)
      WHERE
        dba.vl_zahlavi.STORNO = 0 AND
        dba.vl_zahlavi.TS >= (getdate() -90)
      GROUP BY
        dba.vl_polozky.ID_KARTY

    středa 5. ledna 2011 10:37

Odpovědi

  • Jednou možností je třeba podmínka přímo v SUM:

    SELECT 
      p.ID_KARTY,
      max(p.KARTA) AS KARTA,
      max(p.NAZEV) AS NAZEV,
      sum(p.MNOZSTVI_VYD) AS VYDEJ360,
      sum(CASE WHEN z.TS >= (getdate() - 180) THEN p.MNOZSTVI_VYD ELSE 0 END) AS VYDEJ180,
      sum(CASE WHEN z.TS >= (getdate() - 90) THEN p.MNOZSTVI_VYD ELSE 0 END) AS VYDEJ90
     FROM
      dba.vl_zahlavi z
      INNER JOIN dba.vl_polozky p ON (z.DOKLAD = p.DOKLAD)
     WHERE
      z.STORNO = 0 AND 
      z.TS >= (getdate() -360)
     GROUP BY
      p.ID_KARTY
    
    
    

    To samé lze udělat pro výpočet MAX.

    • Označen jako odpověď dvfx čtvrtek 6. ledna 2011 11:00
    středa 5. ledna 2011 14:06

Všechny reakce

  • Jednou možností je třeba podmínka přímo v SUM:

    SELECT 
      p.ID_KARTY,
      max(p.KARTA) AS KARTA,
      max(p.NAZEV) AS NAZEV,
      sum(p.MNOZSTVI_VYD) AS VYDEJ360,
      sum(CASE WHEN z.TS >= (getdate() - 180) THEN p.MNOZSTVI_VYD ELSE 0 END) AS VYDEJ180,
      sum(CASE WHEN z.TS >= (getdate() - 90) THEN p.MNOZSTVI_VYD ELSE 0 END) AS VYDEJ90
     FROM
      dba.vl_zahlavi z
      INNER JOIN dba.vl_polozky p ON (z.DOKLAD = p.DOKLAD)
     WHERE
      z.STORNO = 0 AND 
      z.TS >= (getdate() -360)
     GROUP BY
      p.ID_KARTY
    
    
    

    To samé lze udělat pro výpočet MAX.

    • Označen jako odpověď dvfx čtvrtek 6. ledna 2011 11:00
    středa 5. ledna 2011 14:06
  • funguje

    díky

    čtvrtek 6. ledna 2011 11:00