Diskuze: Difference value ...
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
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.
???
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)/pocet_hodnot, prumer. a mesic a rok ziskavaji primo z datumu.
google = site:programujte.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.
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
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
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.
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
Chlapci moc děkuji za věnování se mi. Mně se stále nedaří. Vzal jsem si velké sousto na sebe...
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]
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
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
Ahoj kluci.Přikládám soubor csv data. Pokud ještě máte chuť mi pomoc.
Ahoj kluci.Přikládám soubor csv data. Pokud ještě máte chuť mi pomoc. Data
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.
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
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
Zobrazeno 22 zpráv z 22.