MS SQL pivot transformace   otázka

SQL

Dobrý den,

řeším jeden zajímavý problém - na MS SQL serveru mám uloženou tabulku, do které přibývají každý měsíc řádky a která vypadá zhruba takhle:

jmeno  hodnota  stavKeDni
Karel  2        31.1.2013
Jarda  10       31.1.2013
Pepa   6        31.1.2013
Karel  3        25.2.2013
Jarda  11       25.2.2013
Pepa   7        25.2.2013
Karel  5        31.3.2013
Jarda  9        31.3.2013
Pepa   2        31.3.2013
Filip  2        31.3.2013

Potřeboval bych vytvořit nějaký dotaz, který nezávisle na počtu vytvořených 'snímků' - definovaných podle dat, vytvořil pohled, který by vypadala nějak takhle (sloupce s datumy by se automaticky přidávaly):

Jmeno 31.1.2013 25.2.2013 31.3.2013 Final

Karel 2 +1 +2 5

Jarda 10 +1 -2 9

Pepa 6 +1 -5 2

Filip (null nebo 0)(null nebo 0) 2 2

Je možné něco takového vytvořit? Mám k dispozici MS SQL 2k8 a Access 2010, do kterého jsou přilinkovány tabulky. Rád bych to ale vytvořil jako view na serveru, tak aby tomu bylo jedno jaký frontend to zobrazuje. Tuším cestu v PIVOTu, ale nepodařilo se mi z toho dostat nějaký rozumný výsledek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se za chybějící formát u druhého výstupu, měl by vypadat nějak takhle

Jmeno     31.1.2013   25.2.2013   31.3.2013  Final
Karel         2         +1           +2        5
Jarda        10         +1           -2        9
Pepa          6         +1           -5        2
Filip (null nebo 0) (null nebo 0)     2        2
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Křížové dotazy se na MS SQL dají řešit několika způsoby, záleží na tom jestli mají být dynamické nebo statické (mění/nemění se počet sloupců).

Druhá věc je že data musí být agregovaná (sum, count, avg,..) a záhlaví sloupců i řádků musí být seskupená. (o to se stará až PIVOT)

To znamená že třeba pepa se vám tam nezobrazí dvakrát.

Poté máte opět asi dva způsoby jak pokračovat.

CASE a PIVOT.

Doporučuji PIVOT podle toho co vím je novější, ale havně rychlejší na napsaní.

Použití vypadá si nějak takto:

select * from (select Jmeno, Hodnota, StavKeDni from vaseTabulka) as A 
pivot
(
sum(Hodnota)
for StavKeDni in(['31.1.2013'], ['28.2.2013'],..)
)as B'

Toto je statický příklad. Pro dynamický provedení je nutné dosadit do závorky "in()" všechny hodnoty v kódu. To lze řešit tak, že celý dotaz dáte jako string (varchar) a vytáhnete si do proměné hodnoty ve sloupcích a pak je dosadíte do té závorky. A celé to spustíte přes EXEC(dotaz).

Tohle by mělo být to co potřebujete

http://sqlyoga.com/2012/12/sql-server-cr...

Automaticky v záhlaví řádků budou ti lidé.

alias as A je a as B je povinný - nevím proč ale bez nich to nefunguje

to celé pak lze uložit jako pohled

create view <nazev> as(celý dotaz)

v případě dynamického si nejsem jistý jestli to lze uložit jako dotaz ale rozhodně lze udělat procedůru a tu pak volat

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za radu, zkusím se s tím poprat a případně sem hodím nějaký výsledek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback