Select Pivot SQL   otázka

VB.NET, SQL, Databáze

Zdravím všechny ve spolek prosím o pomoc s doplnění a upřesněním syntaxe SQL dotazu.

Mám dvě tabulky: 1) Zbozi 2) Pohyby

První tabulka obsahuje DB zboží se strukturou:

ID, Nazev, Cena, MJ

Druhá tabulka řeši pohyby prodejnosti po jednotlivých dnech a struktura je následující:

ID, Datum, ID_Zbozi, ID_Prodejce, Mnozstvi

Řekněme, že jsou tam základní data

Tab1:

ID     NAZEV          CENA    MJ
--------------------------------
1      Meloun         20      ks
2      Kiwi            5      ks
3      Skorice        49      ks
4      Zazvor         62      ks
5      Prevodovka   5200      ks

Tab2:

ID     Datum,        ID_Zbozi, ID_Prodejce, Mnozstvi
-----------------------------------------------------
1      01.10.2013     1        1            8
2      01.10.2013     2        1            6
3      02.10.2013     1        1            3
4      03.10.2013     4        1            12
5      05.11.2013     5        1            4
6      05.11.2013     5        2            1
7      05.10.2013     5        1            2
8      05.10.2013     5        2            3

Výsledek by měla být křížová tabulka filtrovaná dle data v rozsahu od-do a dle prodejce,

takže tabulka prodeje za říjen prodejce č. 1 by měla mít výsledek:

ID_Zbozi       Prodejce     01.10.     02.10.   03.10.     04.10.    05.10.
---------------------------------------------------------------------------
1              1            8          3
2              1            6
4              1                                12
5              1                                                      2

S pomocí NETu a zdejšího fóra jsem vytvořil následující dotaz:

With Tabulka As (select Tab2.ID_Prodejce, Tab2.datum, Tab2.Mnozsstvi, Tab1.Nazev From Tab2 
INNER JOIN Tab1 ON Tab2.ID_Zbozi = Tab1.ID)
 select * from (Select  datum, Nazev, Mnozstvi from Tabulka) As A pivot (SUM(mnozstvi) for datum in (" + DatumText + ")) As B

ALE má to následující mouchy:

1) Zobrazí se tam i zboží, které v daném časovém období vůbec nemělo pohyb. To tam být nemá.

2) Neumím tam začlenit filtrování JEN KONKRÉTNÍHO PRODEJCE

3) A potřeboval bych tam mít sumarizace jak sloupců tak řádků.

Mnohokrát díky budu vděčný za každou pomoc.

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

Prosím... dokáže mi někdo poradit nebo navést ??

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

V SQL by to mohlo být asi takhle (sloupec Datum je u mě typu datetime):

WITH Tabulka
AS
(SELECT Zbozi.ID AS ID_Zbozi, Pohyby.ID_Prodejce, CONVERT(varchar(10), Pohyby.Datum, 104) AS Datum,
	   Pohyby.Mnozstvi, Zbozi.Nazev
  FROM Pohyby INNER JOIN
	   Zbozi ON Pohyby.ID_Zbozi = Zbozi.ID)
SELECT ID_Zbozi, ID_Prodejce, Nazev, [01.10.2013], [02.10.2013], [03.10.2013], [04.10.2013], [05.10.2013]
  FROM (SELECT ID_Zbozi, ID_Prodejce, Nazev, Datum, Mnozstvi FROM Tabulka) AS SourceTable
 PIVOT
 (
	SUM(Mnozstvi) FOR Datum IN ([01.10.2013], [02.10.2013], [03.10.2013], [04.10.2013], [05.10.2013])
 ) AS PivotTable
 WHERE ID_Prodejce = 1
   AND EXISTS(SELECT NULL FROM Tabulka Sub
	           WHERE Sub.Datum IN ('01.10.2013', '02.10.2013', '03.10.2013', '04.10.2013', '05.10.2013')
			     AND Sub.ID_Zbozi = PivotTable.ID_Zbozi)
UNION ALL 
SELECT NULL AS ID_Zbozi, NULL AS ID_Prodejce, 'Celkem' AS Nazev, SUM([01.10.2013]), SUM([02.10.2013]), SUM([03.10.2013]), SUM([04.10.2013]), SUM([05.10.2013])
  FROM (SELECT ID_Zbozi, ID_Prodejce, Nazev, Datum, Mnozstvi FROM Tabulka) AS SourceTable
 PIVOT
 (
	SUM(Mnozstvi) FOR Datum IN ([01.10.2013], [02.10.2013], [03.10.2013], [04.10.2013], [05.10.2013])
 ) AS PivotTable
 WHERE ID_Prodejce = 1
   AND EXISTS(SELECT NULL FROM Tabulka Sub
	           WHERE Sub.Datum IN ('01.10.2013', '02.10.2013', '03.10.2013', '04.10.2013', '05.10.2013')
			     AND Sub.ID_Zbozi = PivotTable.ID_Zbozi)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prosím J. Holana, jak se zdroj změní, když sloupec DATUM Tab. 2 s typem DateTime nahradíme třemi sloupci

Den = 1-31 (tinyint)

Mesic = 1-12 (tinyint)

Rok = (smallint)

Mělo by to být jednodušší ?? Princip a žádaný výsledek je stejný.

Díky moc Radek Tesař

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