SQL Graf pre Pocet uzivtelov

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod omnikor 21. 12. 2014 10:31

Potreboval by som vykreslit graf v ktorom sa mi zobrazi sucet vsetkych uzivatelov za kazdy den.

Kód: Vybrat vše
SELECT RegistrationDate, Count(Id) FROM Users
GROUP BY RegistrationDate


Mi vrati pocet uzivatelov ktori sa v konkretny den zaregistrovali. Ja by som potreboval pocet vsetkych uzivatelov ktori su v konkretny den v systeme
omnikor
Junior

Odeslat příspěvekod KačerT 21. 12. 2014 11:07

Tak to asi budeš muset použít jiný sloupec než RegistrationDate, ne?
Pokud takový vůbec v tabulce či jinde máš.
KačerT
Junior

Odeslat příspěvekod omnikor 21. 12. 2014 14:13

KačerT píše:Tak to asi budeš muset použít jiný sloupec než RegistrationDate, ne?
Pokud takový vůbec v tabulce či jinde máš.


Neviem ci si ma pochopil. Pomocou RegistrationDate by sa malo dat vyratat kolko userov je aktualne v systeme pre kazdy den. Akurat funkcia group by groupuje podla: RegistrationDate a ja by som potreboval aby groupoval podla vsetkych datumov nad RegistrationDate.

Proste aby sa mi ku kazdemu datumu pripocitali aj registracie z predchadzajucich dni - aby som dostal celkovy pocet uzivatelov ktori su pre dany den aktualne v systeme.

Ale mozno najjednoduchsie bude prejst vysledky dotazy v cykle a dopocitat to tam ale ajtak by ma azaujimalo ako to riesit priamo cez sql.
omnikor
Junior

Odeslat příspěvekod karlos00x 21. 12. 2014 14:26

1) jaky sql?
2) jaky typ sloupce?
3) ve svem vypoctu zapominas na moznos smazani uzivatele.

IMHO to bude nutne projet v cyklu a udelat select count where date < registrationdate.
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod powlcz 21. 12. 2014 15:09

Select na to máš pěknej, jestli je registrationDate formát datetime tak bych ho přecastoval na date, takže ti to hodí count z každého dne...

Nicméně pokud jsem to pochopil, tak tě nezajímají registrace, ale loginy za každý den? Pak musíš mít log loginů a z registrací to opravdu nevyčteš a pokud ano, je to opravdu špatná koncepce db...

Budeš si muset udělat třeba tempovou tabulku, do který nasypeš ID řádků s MIN(RegistrationDate) GROUP BY RegistrationDate.

A pak udělat SELECT kde ID řádků NOT IN(tempová tabulka ID) a to zgrupovat... Tempovka se dá obejít subselectem.

Tak jsem to pochopil podle toho cos popisoval, zgrupovat vše, kromě úplně prvního RegistrationDate
Chronický Ujížděč na nevhodnostech
powlcz
Junior

Odeslat příspěvekod omnikor 21. 12. 2014 15:21

powlcz

ani ty si ma celkom nepochopil skusim to vysvetlit takto:

19.12.2014 sa mi zaregistrovalo 5 uzivatelov
20.12.2014 sa mi zaregistrovali 2 uzivatelia
21.12.2014 sa mi zaregistrovali 8 uzivatelov

no a ja potrebujem dostat takyto vysledok:

19.12.2014 v systeme je 5 uzivatelov
20.12.2014 v systeme je 7 (2 + 5) uzivatelov
21.12.2014 v systeme je 15 (8 + 7) uzivatelov

graf je v JS ale ten mam uz naprogramovany ide mi o dotaz.

karlos00x:

1. SQL Server 2014 ale staci mi ukazka sql aj pre inu db ide mi len o princip riesenia
2. DateTime ktory som pretypoval na DATE
3. To je pravda toto budem riesit asi cez Jobs

-- 21. 12. 2014 15:55 --

Tak nakoniec som vytvoril tabuľku UserCounts a ktomu takýto dotaz:

Kód: Vybrat vše
INSERT INTO UserCounts (VentureId, [Date], [Count])
SELECT VentureId, CAST(GetDate() AS DATE) AS [Date], Count(*) AS [Count] FROM Users GROUP BY VentureId


Ktorý budem spúštať ako Job každý deň, a potom mi už bude stačiť len primitívny select. Takto budem mať prehľad aj o zmazaných užívateľoch
omnikor
Junior

Odeslat příspěvekod powlcz 21. 12. 2014 17:28

Uživatelé se většinou nemažou, mají příznak například "aktivní/neaktivní" ve formě bitu ale mazat je, je celkem neobvyklé.

Už chápu, jasně proto ti group nestačil, v tom případě bys měl udělat jednoduše tohle:

Kód: Vybrat vše
SELECT CAST(RegistrationDate AS DATE) RegistrationDate, users.*  FROM Users userMain
GROUP BY RegistrationDate
LEFT JOIN
(
SELECT CAST(RegistrationDate AS DATE) regDate, users.*
FROM Users
)users
ON userMain.RegistrationDate  = users.regDate


A vtom joinu si stim pohrát jak potřebuješ, píšu to z hlavy nemám tu teď SQL server sry
Chronický Ujížděč na nevhodnostech
powlcz
Junior

Odeslat příspěvekod Husqvik 21. 12. 2014 18:42

Kód: Vybrat vše
SELECT
   [Day],
   COUNT(*) [NewUsers],
   SUM(COUNT(*)) OVER (ORDER BY [Day]) [TotalUsers]
FROM
   (SELECT CAST(RegistrationDate AS DATE) [Day] FROM Users) Users
GROUP BY
   [Day]
Husqvik
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků