none
SELECT pro nečastější výskyt

    Dotaz

  • Zdravím,

    pro SELECT lze provést GROUP BY s přípazy MIN, MAX apod.

    Nikde jsem ale nenalezl, jestli existuje možnost zobrazit jen tu hodnotu, která se v příslušním poli vyskytuje nejčastěji nebo nejméně často.

    Může mi s tímto někdo poradit? Pro d.DEALER by jsem chtěl zobrazit tu hodnotu, která se v poli pro každého ID_PARTNERA vyskytuje nejčastěji.

    Děkuji

    SELECT 
      d.ID_PARTNERA,
      MAX(d.NAZEV) AS NAZEV,
      MAX(d.DEALER) AS DEALER,
      SUM(d.SUMA) AS CASTKA,
      COUNT(DISTINCT d.ID_ODBERATELE) AS POCET_DOD_MIST
    FROM
      d
    GROUP BY
      d.ID_PARTNERA

    9. ledna 2011 19:33

Odpovědi

  • NJN, to je tím, že jsem si neudělal testovací tabulku pro tenhle případ...

    Pokud se použije GROUP BY, musí být všechny sloupce buď v GROUP BY nebo v nějaké agregační funkci, takže pomůže:

    SELECT 
     d.ID_PARTNERA,
     MAX(d.NAZEV) AS NAZEV,
     MAX(d.DEALER) AS DEALER,
     SUM(d.SUMA) AS CASTKA,
     COUNT(DISTINCT d.ID_ODBERATELE) AS POCET_DOD_MIST,
     d2.DEALER AS NejDEALER
    FROM
     d
    INNER JOIN (SELECT ID_PARTNERA, DEALER FROM 
     (SELECT ID_PARTNERA, DEALER, 
     ROW_NUMBER() over(partition by ID_PARTNERA order by DEALER, dcnt DESC) rn
      FROM (SELECT ID_PARTNERA, DEALER, COUNT(*) AS dcnt 
        FROM d GROUP BY ID_PARTNERA, DEALER) d1 ) d3
     WHERE rn = 1) d2 ON d2.ID_PARTNERA = d.ID_PARTNERA
    GROUP BY
     d.ID_PARTNERA, d2.DEALER
    
    
    
    • Označen jako odpověď dvfx 11. ledna 2011 13:08
    11. ledna 2011 12:57

Všechny reakce

  • Hmm, to se asi budou muset nejdříve spočítat četnosti, potom z nich vybrat nejvyšší (otázku, co dělat, bude-li jich více shodných, ponechme stranou) a výsledek spojit s existujícím dotazem. Třeba takto:

    SELECT 
     d.ID_PARTNERA,
     MAX(d.NAZEV) AS NAZEV,
     MAX(d.DEALER) AS DEALER,
     SUM(d.SUMA) AS CASTKA,
     COUNT(DISTINCT d.ID_ODBERATELE) AS POCET_DOD_MIST,
     d2.DEALER AS NejDEALER
    FROM
     d
    INNER JOIN (SELECT ID_PARTNERA, DEALER, 
      ROW_NUMBER() over(partition by ID_PARTNERA order by DEALER, dcnt DESC) rn
      FROM (SELECT ID_PARTNERA, DEALER, COUNT(*) AS dcnt 
       FROM d GROUP BY ID_PARTNERA, DEALER) d1
      WHERE rn = 1) d2 ON d2.ID_PARTNERA = d.ID_PARTNERA
    GROUP BY
     d.ID_PARTNERA
    
    

    a nejspíš to asi půjde i jinak...

    10. ledna 2011 23:46
  • Dobrý den,

    mám potíže s tímto řádkem. I když jsem tam doplnil AS tak mi to stále hlási chybu "Invalid column name rn"

    ROW_NUMBER() over(partition by ID_PARTNERA order by DEALER, dcnt DESC) AS rn

    11. ledna 2011 11:02
  • To jsem jen zapomněl, že ve WHERE nelze použít sloupec rn...

     

    SELECT 
     d.ID_PARTNERA,
     MAX(d.NAZEV) AS NAZEV,
     MAX(d.DEALER) AS DEALER,
     SUM(d.SUMA) AS CASTKA,
     COUNT(DISTINCT d.ID_ODBERATELE) AS POCET_DOD_MIST,
     d2.DEALER AS NejDEALER
    FROM
     d
    INNER JOIN (SELECT ID_PARTNERA, DEALER FROM 
     (SELECT ID_PARTNERA, DEALER, 
      ROW_NUMBER() over(partition by ID_PARTNERA order by DEALER, dcnt DESC) rn
       FROM (SELECT ID_PARTNERA, DEALER, COUNT(*) AS dcnt 
           FROM d GROUP BY ID_PARTNERA, DEALER) d1 ) d3
      WHERE rn = 1) d2 ON d2.ID_PARTNERA = d.ID_PARTNERA
    GROUP BY
     d.ID_PARTNERA
    
    
    11. ledna 2011 11:24
  • Tohle mi píš za chybu. Testoval jsem to nějak předělat, ale učím se to jen 2 měsíce a je to na mě ještě složité.

    column d2.DEALER is invalid in the SELECT because it isnt contained in either an agregate function or the GROUP BY clause.

     

    11. ledna 2011 12:21
  • NJN, to je tím, že jsem si neudělal testovací tabulku pro tenhle případ...

    Pokud se použije GROUP BY, musí být všechny sloupce buď v GROUP BY nebo v nějaké agregační funkci, takže pomůže:

    SELECT 
     d.ID_PARTNERA,
     MAX(d.NAZEV) AS NAZEV,
     MAX(d.DEALER) AS DEALER,
     SUM(d.SUMA) AS CASTKA,
     COUNT(DISTINCT d.ID_ODBERATELE) AS POCET_DOD_MIST,
     d2.DEALER AS NejDEALER
    FROM
     d
    INNER JOIN (SELECT ID_PARTNERA, DEALER FROM 
     (SELECT ID_PARTNERA, DEALER, 
     ROW_NUMBER() over(partition by ID_PARTNERA order by DEALER, dcnt DESC) rn
      FROM (SELECT ID_PARTNERA, DEALER, COUNT(*) AS dcnt 
        FROM d GROUP BY ID_PARTNERA, DEALER) d1 ) d3
     WHERE rn = 1) d2 ON d2.ID_PARTNERA = d.ID_PARTNERA
    GROUP BY
     d.ID_PARTNERA, d2.DEALER
    
    
    
    • Označen jako odpověď dvfx 11. ledna 2011 13:08
    11. ledna 2011 12:57
  • perfektní

    jo už tomu začínam rozumět

    díky

    11. ledna 2011 13:08