IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
c.bohumil
Člen
Avatar
c.bohumil:20.4.2021 19:51

Difference from

Zkusil jsem: Zkoušel jsem vše dle mých možností..

Chci docílit: Snažím se dosáhnout rozdílu mezi jednotlivými měsíci. V prvním měsíci hodnota ,která každým měsícem stoupá. Potřeboval bych z těchto hodnot rozdíl o měsíc zpětně. Leden 215000,Únor 300000.Jak bych mohl dosáhnout difference from?
Děkuji

 
Odpovědět
20.4.2021 19:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.4.2021 8:53

Nejak takhle by to neslo? Nechce se mi ale hledat, jak se presne pise ten groupconcat a sum.

SELECT SUM(value), GROUPCONCAT month
(
SELECT COUNT(*) as n, value, month ORDER BY month ASC
UNION
SELECT COUNT(*)+1 as n, -value, month ORDER BY month ASC
)
GROUP BY n
Editováno 21.4.2021 8:55
 
Nahoru Odpovědět
21.4.2021 8:53
Avatar
Petan
Člen
Avatar
Petan:21.4.2021 9:24

Co neco takoveho

SELECT A1.year,A1.mon­th,A1.money - A2.money
FROM TABULKA AS A1
INNER JOIN TABULKA AS A2 ON (A1.year * 12 + A1.month) = (A2.year * 12 + A2.month +1)

 
Nahoru Odpovědět
21.4.2021 9:24
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Peter Mlich
c.bohumil:20.5.2021 4:54

Děkuji za reakci. Stále se mi to nedaří. Snažím se v MS SQL a upřesním co potřebuji. Mám firmy kde každý měsíc se dělají odečty energií. Záznam je stav hodin a snažím se o výstup rozdílu mezi měsíci. Složitější je to, že pod jménem firmy je ještě různý objekt. Na obr je vidět s čím vším pracuji.

Editováno 20.5.2021 4:56
 
Nahoru Odpovědět
20.5.2021 4:54
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Petan
c.bohumil:20.5.2021 4:56

Děkuji za reakci. Stále se mi to nedaří. Snažím se v MS SQL a upřesním co potřebuji. Mám firmy kde každý měsíc se dělají odečty energií. Záznam je stav hodin a snažím se o výstup rozdílu mezi měsíci. Složitější je to, že pod jménem firmy je ještě různý objekt. Na obr je vidět s čím vším pracuji.

 
Nahoru Odpovědět
20.5.2021 4:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.5.2021 8:11

???
ADL = GROUP BY firm
ADL + garaze = GROUP BY firm, Object

google = group by sql example
https://learnsql.com/…ql-group-by/

SELECT
  EXTRACT(YEAR FROM date) AS year,
  EXTRACT(MONTH FROM date) AS month,
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY
  EXTRACT(YEAR FROM date),
  EXTRACT(MONTH FROM date);

Akorat, ze jejich kod dela neco jineho, average je suma(hodnot)/po­cet_hodnot, prumer. a mesic a rok ziskavaji primo z datumu.

google = site:programuj­te.com rozdil dvou radku sql
http://programujte.com/…dek-do-jine/
Tady resi taky neco podobneho

INSERT INTO vysledky (vysledek1, vysledek2)
(
    SELECT (posledni.sloupec1 - predposledni.sloupec1), (posledni.sloupec2 - predposledni.sloupec2) FROM (
        SELECT * FROM tabulka ORDER BY id DESC LIMIT 1
    ) AS posledni
    JOIN (
        SELECT * FROM tabulka ORDER BY id DESC LIMIT 1,1
    ) AS predposledni
);

Unionem+group by nebo joinem to propojis, dve stejne tabulky, jen u jedne posunes mesic.

 SELECT
            rok, mesic, firma, objekt,
            SUM(hodnota) FROM (
        SELECT rok, mesic, firma, objekt, hodnota FROM tabulka
    ) AS a
    JOIN (
        SELECT rok, mesic-1, firma, objekt, -hodnota FROM tabulka
    ) AS b
) c
GROUP BY rok, mesic, firma, objekt

Ale jen tipuji. Nemas to nekde v csv nebo sql insertech, ta data? Obrazky jsou super, ale to nenaimportujes do testovaci databaze.

Editováno 20.5.2021 8:13
 
Nahoru Odpovědět
20.5.2021 8:11
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.5.2021 8:20

Mozna v lepsim formatovani, totez. Ale, jak jsem psal, nejsem si uplne jisty tim zapisem, co tam musi a nemusi byt. Trea to AS a, AS b, bych tam nedaval. Ale vim, ze mi na neco podobneho uz nejake sql psalo chybu a ze jsem to pak pracne googloval, nejaky podobny priklad.

SELECT
    rok, mesic, firma, objekt,
    SUM(hodnota)
FROM
    (SELECT rok, mesic, firma, objekt, hodnota FROM tabulka) AS a
    JOIN
    (SELECT rok, mesic-1, firma, objekt, -hodnota FROM tabulka) AS b
GROUP BY
    rok, mesic, firma, objekt
 
Nahoru Odpovědět
20.5.2021 8:20
Avatar
Petan
Člen
Avatar
Petan:20.5.2021 11:21

Co toto

SELECT
        A.Year,
        A.Month,
        A.Firm,
        A.Object,
        A.EL_VT - B.EL_VT,
        A.EL_NT - B.EL_NT,
...
FROM Tab1 A
INNER JOIN Tab1 B ON A.Year * 12 + MONTH(A.Month + ' 1 2014') = (B.Year * 12 + MONTH(B.Month + ' 1 2014') + 1)
AND A.Firm = B.Firm AND A.Object = B.Object
 
Nahoru Odpovědět
20.5.2021 11:21
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.5.2021 13:10

A jooo, on ma udaj mesice v tabulce jako text. Se ted koukam, co tam ma Petan za konverze a on to proste sikovne prevadi na cislo :) Rok uz ale asi neni treba tak prevadet.

MONTH(A.Month + ' 1 2014')

a pak uz je samozrejme klasicka rovnice

cislo1 = y*12 + m
cislo2 = y*12 + m + 1

Clovek se porad uci neco noveho :)
Otazkou je, jak to bude rychle. Asi to nebude moc rychle. Mozna by stalo za to pridat tam sloupec a prevest ten string na cislo. Drzet to tam duplicitne prave jen kvuli tomu vypisu. Nebo opravit program, aby to ukladal v cislech.
Porovnani cisel do 65.000 jsou 2 byte (256*256), 2 znaky.
Porovnani stringu "January" je 7 znaku, to je cas 7/2 T proti 1 T, 3.5x rychlejsi zobrazeni te tabulky.

 
Nahoru Odpovědět
20.5.2021 13:10
Avatar
Petan
Člen
Avatar
Odpovídá na Peter Mlich
Petan:20.5.2021 19:55

Je fakt ze to nebude rychle, ale do nejakych 50 -100000 zaznamu na dobrem serveru vpohode, jinak by bylo dobre ukladat rok + mesic jako cislo, nebo nektere SQL servery umoznuji computed column a na nem index

 
Nahoru Odpovědět
20.5.2021 19:55
Avatar
Petan
Člen
Avatar
Petan:20.5.2021 20:01

No tabulka kde je měsíc dany jako text je spatne

 
Nahoru Odpovědět
20.5.2021 20:01
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Peter Mlich
c.bohumil:20.5.2021 20:53

Chlapci moc děkuji za věnování se mi. Mně se stále nedaří. Vzal jsem si velké sousto na sebe...

 
Nahoru Odpovědět
20.5.2021 20:53
Avatar
c.bohumil
Člen
Avatar
c.bohumil:20.5.2021 21:09

Takto importuji z excelu

SELECT TOP (1000) [Id]
      ,[ID_1]
      ,[ID_2]
      ,[ID_3]
      ,[Datum]
      ,[Firma]
      ,[Objekt]
      ,[Poznámky]
      ,[Odečet]
      ,[Č El]
      ,[El VT Kwh]
      ,[Hodnota VT]
      ,[El NT Kwh]
      ,[Hodnota NT]
      ,[Plyn m3]
      ,[Voda m3]
      ,[Teplo Gj]
      ,[1/4hod max]
      ,[JAL kVarh2]
  FROM [OdberyDB].[dbo].[Firmy]
 
Nahoru Odpovědět
20.5.2021 21:09
Avatar
c.bohumil
Člen
Avatar
c.bohumil:20.5.2021 21:11

Takto mám zatím výstup..

select
--Datum
  DATENAME(YEAR,Datum ) AS Year
, DATENAME(MONTH,Datum ) AS Month
, [Firma] AS Firm
, [Objekt] AS Object
, SUM ([El VT Kwh]) AS EL_VT
, SUM ([El NT Kwh]) AS EL_NT
, SUM ([Plyn m3]) AS Gas
, SUM ([Voda m3]) AS Water
, SUM ([Teplo Gj]) AS Heat
, SUM ([JAL kVarh2]) AS Jal
--, [1/4hod max]






from dbo.Firmy
GROUP BY
  Datum
, Firma
, Objekt
--, [El VT Kwh]
--, [El NT Kwh]
--, [Plyn m3]
--, [Voda m3]
--, [Teplo Gj]
--, [Jal kVarh2]
--, [1/4hod max]

 --ORDER BY Měsíc ASC
 
Nahoru Odpovědět
20.5.2021 21:11
Avatar
Petan
Člen
Avatar
Petan:21.5.2021 7:52

Tak to by chtelo rozdelit

1. Vytvorit VIEW

CREATE VIEW EnergieMesic AS
select
--Datum
YEAR(Datum) * 12 + MONTH(Datum) AS MesicIndex
,  DATENAME(YEAR,Datum ) AS Year
, DATENAME(MONTH,Datum ) AS Month
, [Firma] AS Firm
, [Objekt] AS Object
, SUM ([El VT Kwh]) AS EL_VT
, SUM ([El NT Kwh]) AS EL_NT
, SUM ([Plyn m3]) AS Gas
, SUM ([Voda m3]) AS Water
, SUM ([Teplo Gj]) AS Heat
, SUM ([JAL kVarh2]) AS Jal
--, [1/4hod max]

from dbo.Firmy
GROUP BY
 YEAR(Datum) * 12 + MONTH(Datum)
 ,Datum
, Firma
, Objekt
--, [El VT Kwh]
--, [El NT Kwh]
--, [Plyn m3]
--, [Voda m3]
--, [Teplo Gj]
--, [Jal kVarh2]
--, [1/4hod max]

 --ORDER BY Měsíc ASC

a potom viz vise
kde nahradis ve from

 EnergieMesic A
INNER JOIN EnergieMesic B ON A.MesicIndex = B.MesicIndex + 1

Stalo by za to absolvovat nejake skoleni na SQL

 
Nahoru Odpovědět
21.5.2021 7:52
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Petan
c.bohumil:27.5.2021 17:50

Ahoj kluci.Přikládám soubor csv data. Pokud ještě máte chuť mi pomoc.

Data

 
Nahoru Odpovědět
27.5.2021 17:50
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Peter Mlich
c.bohumil:27.5.2021 17:50

Ahoj kluci.Přikládám soubor csv data. Pokud ještě máte chuť mi pomoc. Data

 
Nahoru Odpovědět
27.5.2021 17:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.5.2021 10:43

Asi ti to bude uplne k nicemu, ale zkousel jsem to v tom google doc. Neumim to ale natukat do query, protoze to nepouziva normalni sql syntax ani funkce :) Takze jsem to zkusil pomalu, upravou sloupcu, ale zaverecne query mi tam stejne nejde.

1. z te stranky - save csv

2. google-doc - novy soubor - import - ten csv soubor, oddelovat strednik ; (a ted je z toho pekna tabulka)

3.
rok = 2000+RIGHT(B6;2) (uprava sloupce Datum z formatu 30.IV.20)
mesic = INDEX(SPLIT(B6; ".";);1;2) (uprava sloupce Datum z formatu 30.IV.20)
...pak je treba to preformatovat na cislo. Ten vzorecek ti bude jiste sympaticky :) A pozor, je tam takova finta, delsi retezec musis nahradit drive nez kratsi, takze poradi je XII, XI, IX, X pri nahrazeni a totez VII, VI, IV, V, jinak ti to udela samozrejme spatne :)
mesic = VALUE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(Q6; "XII"; "12"); "XI"; "11"); "IX"; "9"); "X"; "10"); "VIII"; "8"); "VII"; "7"); "VI"; "6"); "IV"; "4"); "V"; "5"); "III"; "3"); "II"; "2"); "I"; "1"))
El VT Kwh = value(G6)
El NT Kwh = value(H6)

4. A nyni, kdyz mam konecne pripravenou tabulku, tak jsem zahajil fazi klonovani tabulky
P R S T jsou sloupce rok, mesic, value1, value2
=IF(R2>1;P2;P2-1) // rok (kdyz je mesic-1 mensi nez 1, tak je treba odecist i rok)
=IF(R2>1;R2-1;12) // mesic-1
=-S2
=-T2

5. No, a nyni by melo stacit to pomoci grupu sloucit a sesumovat, jenze, to mi neslo
=QUERY(A2:T534,"SELECT P, R, C, D, SUM(S), SUM(T) GROUP BY P, R, C, D")
P R S T jsou sloupce rok, mesic, value1, value2
C, D jsou sloupce firma, objekt

Ale, to grupovani by melo jit resit uz nejakou jinou metodou, aspon v excelu. Kontingencni tabulky nebo tak, tusim.

Editováno 28.5.2021 10:45
 
Nahoru Odpovědět
28.5.2021 10:43
Avatar
Petan
Člen
Avatar
Petan:29.5.2021 0:08

Mam trochu chaos v tvých tabulkách
tady je řešeni které bezi na mssql v temp databázi

        --vytvorime pomocnou tabulu
        CREATE TABLE #Odbery
        (
        [ID_1] varchar(20),
        [Datum] varchar(20),
        [Firma] varchar(50),
        [Objekt]        varchar(50),
        [Poznámky]     varchar(50),
        [Odečet]       varchar(50),
        [El VT Kwh]     int,
        [El NT Kwh]     int,
        [Plyn m3]       int,
        [Voda m3]       int,
        [Teplo Gj]      int,
        [1/4hod max]    int,
        [JAL kVarh2]    varchar(50)
        )

        --naplnime z csv
        BULK INSERT #Odbery
    FROM 'C:\Temp\Odběry_terén_r1.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ';',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
    )

        --smazeme neplatne zanamy
        delete from #Odbery where ID_1 IS NULL

        --opravime datum
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.I.','.1.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.II.','.2.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.III.','.3.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.IV.','.4.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.V.','.5.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.VI.','.6.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.VII.','.7.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.VIII.','.8.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.IX.','.9.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.X.','.10.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.XI.','.11.20')
        UPDATE #Odbery SET Datum = REPLACE(Datum,'.XII.','.12.20')

        --zobrazime vysledky
        SELECT
        YEAR(CONVERT(date,A.Datum,104)) as rok,
        MONTH(CONVERT(date,A.Datum,104)) as mesic,
        A.Firma,
        A.[Objekt],
        A.[El VT Kwh] - B.[El VT Kwh] as [El VT Kwh],
        A.[El NT Kwh] - B.[El NT Kwh] as [El NT Kwh]
--dalsi pole
FROM #Odbery A
INNER JOIN #Odbery B ON YEAR(CONVERT(date,A.Datum,104)) * 12 + MONTH(CONVERT(date,A.Datum,104)) = (YEAR(CONVERT(date,B.Datum,104)) * 12 + MONTH(CONVERT(date,B.Datum,104)) + 1)
AND A.Firma = B.Firma AND A.[Objekt] = B.[Objekt]

--uklidime po sobe
        drop table #Odbery

vhodne by bylo z tempu to zapsat (INSERT) do nejake tabulky kde bude datum type DATE a az nasledne zpracovat tuto tabulku

snad to pomuze

 
Nahoru Odpovědět
29.5.2021 0:08
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Petan
c.bohumil:29.5.2021 9:07

Výborná práce!!!

 select


 DATENAME(YEAR,A.Datum ) AS Rok,
 DATENAME(MONTH,A.Datum ) AS Měsíc,
 A.Firma ,
 A.[Objekt],
 A.[El VT Kwh] - B.[El VT Kwh] as [El VT],
 A.[El NT Kwh] - B.[El NT Kwh] as [El NT],
 A.[Plyn m3] - B.[Plyn m3] as [Plyn],
 A.[Voda m3],
 A.[Teplo Gj] AS Teplo,
 A.[JAL kVarh2] AS Jal,
 A.[1/4hod max]

from dbo.Firmy A
INNER JOIN [dbo].[Firmy] B ON YEAR(CONVERT(date,A.Datum,104)) * 12 + MONTH(CONVERT(date,A.Datum,104)) = (YEAR(CONVERT(date,B.Datum,104)) * 12 + MONTH(CONVERT(date,B.Datum,104)) + 1)
AND A.Firma = B.Firma AND A.[Objekt] = B.[Objekt]
GO
 
Nahoru Odpovědět
29.5.2021 9:07
Avatar
c.bohumil
Člen
Avatar
c.bohumil:29.5.2021 9:11

Přesně tohle jsem potřeboval a moc mi to pomohlo. Díky za pomoc.
Já přešel z Excelu a snažím se vše napojit na Angular - Aspn.net - SQL a tohle mě posunulo dál. Data z terénu mám napojené, ale tohle na mě už bylo moc...

 
Nahoru Odpovědět
29.5.2021 9:11
Avatar
c.bohumil
Člen
Avatar
Odpovídá na Petan
c.bohumil:29.5.2021 9:21

Hodil by se mi parťák co tomu rozumí :-)

 
Nahoru Odpovědět
29.5.2021 9:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 22 zpráv z 22.