Jak na SELECT - začátečník   zodpovězená otázka

Databáze

Zdravím,

potřeboval bych pomoci s následujícím problémem.

Mám tabulku energie, kde jsou sloupce id, datum a impuls. Do pole impuls se ukládá aktuální hodnota

z elektroměru každých 10 min.

Když chci zjistit kolik jsem spotřeboval za den kWh, použiju tento dotaz:

Select MAX(Impuls) - MIN(Impuls) from energie where Datum between '2014-11-27 0:0:0' and '2014-11-27 23:59:59'

tohle funguje správně.

Nemůžu ale přijít na to, jak to napsat pro více dnů, např. chci měsíční spotřebu po týdnech nebo jednotlivých dnech. Díky za nasměrování

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

Akorát do podmínky, kde nastavujete ten datum a čas ho nenastavujte napevno, ale předejte dva parametry. Tím si můžete vypsat libovolný rozsah a mělo by to fungovat.

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

Pokud chcete zobrazit za každý den, nebo zkrátka za nějakou skupinu, tak se jedná o GROUP BY. To znamená, že ten BEWEEN tam může zůstat. Tím jen omezujete za jaké období to má být. Pod celý skript napíšete ještě GROUP BY a třeba DATE(Datum) = po dnech, nebo YEAR(Dateum), MONTH(Datum) = po měsících a rocích a podobně.

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

Díky, to funguje :). Jen nechápu podle čeho se data řadí. Když dám do podmínky např. týden a potom

7 jednotlivých dotazů dle dnů, dostanu výsledky v jiném pořadí. Chtěl bych, aby bylo řazení dle pole

Datum, ale jakmile jej zahrnu do dotazu, musím jej uvést do GROUP BY a protože se k datum přiřazuje i čas, nefunguje to správně.

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

Doplněte dotaz ještě o klauzuli ORDER BY. Bez této klauzule nemá výsledek definované řádné řazení tj. výsledky jsou vracené v pořadí, které si SQL Server volí sám (vychází z toho, aby byl dotaz zpracováván optimálně, podle zvoleného exekučního plánu apod.)

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

Díky, pořád mi to nešlo, až když jsem dal do ORDER BY DAY(Datum), začalo to fungovat :)

Dotaz vypadá nyní takto:

SELECT (MAX(Impuls) - MIN(Impuls)) / 25 AS kWh  from energie
WHERE Datum BETWEEN '2014-11-01 0:0:0' AND '2014-11-09 23:59:59'
GROUP BY DAY(Datum) ORDER BY DAY(Datum)

Takto položený dotaz vrátí 1 pole setříděné dle dnů. Chtěl bych přidat ještě pole Datum, abych

viděl např.

1.11.2014 | 23.1

2.11.2014 | 21.3

Když Datum přidám, musím jej přidat i do GROUP BY části a v tuto chvíli to přestane fungovat, protože

součástí datumu je i čas a ten je pokaždé jiný.

Neporadil byste?

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

Podle mého toto co tu máte napsáno není až zase tak dobře. Ale to si musíte sám zhodnotit. Já bych osobně použil CONVERT(DATE, [Created]) (jak select, tak group by). To vám vrátí jen datum. Tím pádem můžete grupovat i sortovat podle celého datumu. Ne jen podle dne nehledě na rok. Následně by jste ani nemusel sortovat. Ale to si musíte testnout.

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

Díky moc, teď to funguje přešně dle mých představ :)

kód dotazu vypadá následovně:

select CONVERT(date, Datum) AS Datum, (MAX(Impuls) - MIN(Impuls)) / 25 as Rozdil  from energie 
where Datum between '2014-11-01 0:0:0' and '2014-11-09 23:59:59'
group by CONVERT(date, Datum) ORDER BY CONVERT(Date, Datum)

Můžete mi říct, co jste myslel tím "není až zase tak dobře"? Jestli je to čistě názor na styl zápisu

nebo je to takto správnější a příp. proč.

Díky

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