Pivot table v SQL a INNERJOIN   zodpovězená otázka

C#, VB.NET, SQL

Mám tabulku hodnoty (idosoba, datum, hodnota) a tabulku lide (idosoba,prijmeni, jmeno)

Potřebuji pomocí SQL dotazu z tabulky vytáhnout max. hodnoty pro jednotlivé osoby pro každý datum - udělat kontingenční tabulku(pivot table). Pomocí googlu a metodou pokus omyl jsem dosáhl jakési kontingenční tabulky, kde skutečně ke každému datu vznikne sloupeček a v řádcích je očekávaný výsledek. Jak ale dostanu do tabulky místo idosoba příjmení a jméno? Jak tam zapracovat INNERJOIN? Popřípadě jak jinak dosáhnout výsledku, kde bude tabulka ve tvaru:

Příjmení a jméno 1.1.2011 31.12.2011 1.1.2012

Novák Josef 50 80 85

Vokurka František 70 55 73

Tady jsem skončil ...

DECLARE @columns VARCHAR(8000)
SELECT @columns = COALESCE(@columns + ',[' + cast(datum as varchar) + ']',
                         '[' + cast(datum as varchar)+ ']')
			
FROM    Hodnoty
GROUP BY datum



DECLARE @query VARCHAR(8000)
SET @query = '
SELECT *
FROM Hodnoty
PIVOT
 (
 MAX(hodnota)
 FOR [datum]
 IN (' + @columns + ')
 )
 AS p'

EXECUTE(@query)


Děkuji za každou odpověď

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nejdřív se naučte alespoň základy SQL než se začnete pouštět do "složitějších" věcí.nemůžete přeci vše řešit psaním na fóra.A zrovna tato věc nepatří mezi těžká,stačí jen umět základy ;-)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Děkuji za odpověď. Víte, v mých letech se už učím jen to, co ještě nutně potřebuji nebo považuji za nutné. Programování není moje povolání, jen si tím, že si dokážu některé věci naprogramovat, ulehčuji práci (nebo pár kamarádům). Základy SQL znám, tady ale jaksi tápu. A abych se to celé učil, to už nepovažuji za nutné a ani na to nemám čas. Vaše odpověď je ve stylu p. Linharta, jen s tím rozdílem, že on alespoň vždycky ví, o čem píše. Pokud mi nechcete nebo nedokážete poradit, neztrácejte se mnou čas podobnými radami. Já to samozřejmě dokážu zbastlit jiným způsobem, než použitím jednoho SQL dotazu, ale myslel jsem si, že to fórum je tu právě pro takové otázky.

Mimochodem, myslím si, že ten problém taky nezvládnete. Nebo se pletu?

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

K tomuhle jsou fora urcena. Je to myslim zajimavy problem a zrovna toto je funkce, ktera se vetsinou pouza ne tolik casto. A jedna se o dotaz k implementaci, tazatel ocividne uz nejake reseni zkousel najit, takze nevidim problem.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Myslím, že tohle by mohlo být ono:

DECLARE @PivotColumnHeaders VARCHAR(MAX)
 SELECT @PivotColumnHeaders = 
  COALESCE(
     @PivotColumnHeaders + ',[' + convert(varchar,datum,104) + ']',
     '[' + convert(varchar,datum,104)+ ']'
   )
 FROM hodnoty group by datum
 
 
DECLARE @PivotTableSQL NVARCHAR(MAX)
 SET @PivotTableSQL = N'
 
select
   *
 from
 (
   select
     os.jmeno+'' ''+os.prijmeni osoba , hod.datum, hod.hodnota 
   from hodnoty hod
   inner join osoby os
     on hod.ID = os.ID
 ) as Tabulka
 PIVOT
 (
   max(hodnota)
   FOR datum
   IN (
     '+ @PivotColumnHeaders +' 
 
   )
 ) PivotTable
 '
 EXECUTE(@PivotTableSQL)
 


nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Super. To je přesně ono. Díky moc.

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

Pěkný příklad je zde:

https://www.codeproject.com/Tips/500811/...

Albert Bod

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