pivot błąd puste komórki

0

Witam.
Mam mam pojedynczą tabelkę do której zapisuje odebrane dane z poboru energii na malarni, kompresory itp odebrane z kilku lumeli.
czas, urządzenie, rejestr, wartość
2019-03-12 12:00, 1032, 7066, 425
2019-03-12 12:00, 1040, 7066, 800
gdzie urządzanie 1032 to np malarnia a 1040 trafo, rejestr 7066 to jest zawsze moc15 minut
poniżej kod zapytania - ale zwraca mi cos takiego

2019-03-18 01:00 :00 NULL NULL NULL
2019-03-18 01:00 :00 NULL NULL 15420
2019-03-18 01:00 :01 15054.2 11961.7 NULL
2019-03-18 01:00 :01 NULL NULL 18420

dla tego samego czasu daje dwie odpowiedzi

 SELECT 
	FORMAT(czas, 'yyyy-MM-dd hh:mm :ss') AS czas,
	sum(CASE WHEN  rejestr = 7066 and  id_zap= '1032'  THEN wartosc ELSE NULL END) as RS1moc,
	sum(CASE WHEN  rejestr = 7066 and  id_zap= '1035'  THEN wartosc ELSE NULL END) as RS2moc ,
	sum(CASE WHEN  rejestr = 7066 and  id_zap= '1040'  THEN wartosc ELSE NULL END) as RS11_moc
	FROM dane_akt
    where  czas  BETWEEN '2019-03-18 00:00:00' and '2019-03-20 23:59:00' 
GROUP BY czas 
order by czas

dla zapytania poniżej daje tysiące danych a może ich być max 2000

with 
temp0 as (select DISTINCT czas, wartosc , id_zap from dane_akt 
	where rejestr='7066'and czas BETWEEN '2019-03-18 00:00' and '2019-03-20 10:00'),
temp1 as (select  wartosc as rs1 from temp0
 	where  id_zap= '1032'),
temp2 as (select  wartosc as rs2 from temp0
  	where  id_zap= '1040')
select  czas, temp1.rs1,temp2.rs2
from temp0, temp1 , temp2 

Jestem kiepski w SQL i pewno coś przeoczyłem.
Na koniec okazało sie ze to już jest niepotrzebne ale nie daje mi to spokoju.
Proszę o podpowiedź

0

Strasznie nie składnie piszesz, także nie do końca wiem co wstawiasz a jaki wynik dostajesz (w sensie te przykładowe).
Ale na pewno powinieneś poprawić tą część:

sum(CASE WHEN  rejestr = 7066 and  id_zap= '1032'  THEN wartosc ELSE NULL END) as RS1moc,

na:

sum(CASE WHEN  rejestr = 7066 and  id_zap= '1032'  THEN wartosc ELSE 0 END) as RS1moc,

I tak dla każdego. Dlaczego ? Bo sumujesz te rekordy .. jeśli więc 1 rekord będzie miał NULL cały wynik sumy da NULL.

0

Sorki zawsze szybciej piszę niż myślę jak widać wyżej.
wstawiam do tabeli :
czas, urządzenie, rejestr, wartość
dane :
2019-03-12 12:00, 1032, 7066, 425
2019-03-12 12:00, 1040, 7066, 800
w pierwszym zapytaniu dostaje dużo podwójnych wyników ale tu chyba masz racje.
Drugie inne zapytanie do tej samej tabelki zwraca tysiące wyników a nie powinno być więcej niż 2000.

Dzięki przetestuje jutro

0

Rozumiem, że te 2 rekordy to tylko przykład, a nie "wszystkie" dane na których testujesz i dostajesz te złe wyniki ? Bo z tych 2 rekordów to akurat żaden nie spełnia nawet warunku daty.
I czy kolumna czas ma poprawny format na wejściu ? to że formatujesz ją w SELECT i nazywasz ponownie "czas" nie oznacza, że w WHERE używasz sformatowaną "wersję". Jak już to musiał byś to powtórzyć czyli coś jak:

SELECT 
    FORMAT(czas, 'yyyy-MM-dd hh:mm :ss') AS czas,
    sum(CASE WHEN  rejestr = 7066 and  id_zap= '1032'  THEN wartosc ELSE 0 END) as RS1moc,
    sum(CASE WHEN  rejestr = 7066 and  id_zap= '1035'  THEN wartosc ELSE 0 END) as RS2moc ,
    sum(CASE WHEN  rejestr = 7066 and  id_zap= '1040'  THEN wartosc ELSE 0 END) as RS11_moc
    FROM dane_akt
    where  FORMAT(czas, 'yyyy-MM-dd hh:mm :ss') BETWEEN '2019-03-18 00:00:00' and '2019-03-20 23:59:00' 
GROUP BY czas 
order by czas
0

Witam dołożenie

where  FORMAT(czas, 'yyyy-MM-dd hh:mm :ss') BETWEEN '2019-03-18 00:00:00' and '2019-03-20 23:59:00' 

spowodowało wydłużenie zapytania do 81 s dla tego formatuje czas na początku i wtedy mam tylko 2 sekundy.
Pytam obecnie około 2 mln rekordów.

Moją ideą były trzy oddzielne zapytania do tej samej tabelki i wyświetlenie wyników w trzech kolumnach, niestety wymaga to bardziej złożonego zapytania którego nie jestem wstanie dobrze wykonać w związku z tym znalazłem inna drogę na rozwiązanie końcowego problemu. Dzięki za sugestie.

0

Generalnie WHERE powinien obniżyć czas wykonywania zapytania. Chyba, że go zjebiesz, jak ma miejsce w tym przypadku...
Nawet jeśli masz indeks na polu czas, to baza go nie wykorzystuje przy takim WHERE. Bo formatujesz na string (a masz indeks na datetime, nie na string), a potem jeszcze porównujesz string, co jest zabójstwem dla bazy.
Napisz normalnego WHERE, a zobaczysz możliwości bazy. 2 miliony rekordów to jest nic dla bazy. Pewnie przy takiej ilości dopiero zaczyna się rozkręcac.

0
Marcin.Miga napisał(a):

... a potem jeszcze porównujesz string, co jest zabójstwem dla bazy.

@Marcin.Miga nie daje mi spokoju ten fragment. Rozumiem i w pełni się zgadzam z tym formatowaniem daty do string'a. ale o co chodzi z tym "porównujesz string" ?

Czy np taki przykładowy (z czapy) warunek jest zły ?

WHERE GETDATE() BETWEEN '2018-01-01 00:00:01' and '2019-03-09 22:12:11' 

I jeżeli tak to czym go zastąpić jeśli gdzieś w warunku musimy się odnieść do konkretnej daty/czasu ?

0

@BlackBad: skoro datę za pomocą funkcji FORMAT zamieniłeś w string, to porównujesz stringi. A to nie jest wydajne.
Nie wiem co zwraca GetDate, ale wydaje mi się, że tym datowy, więc tam już będzie szybsze porównanie.

0

Aa ok bo przez chwilę zgłupiałem i myślałem, że mówisz o 2 części czyli "BETWEEN '2018-01-01 0001' and '2019-03-09 2211' "

A co do Format - w WHERE to wyszedłem (nie wiedzieć czemu), z założenia że OP ma te daty w jakimś dziwnym formacie - że w SELECT je formatuje, i założyłem, że w WHERE jeśli używa do porównania format '2019-03-09 2211' to i swoją datę musi tak sformatować .. żeby otrzymać dobre wyniki bo to był 1 z głównych jego problemów, że otrzymywał złe wyniki. Teraz jak tak patrzę na te przykładowe dane od OP to w sumie wychodzi, że na wejściu miał dobry format :| Na moje usprawiedliwienie napisze, że w poście zapytałem jaki jest format i że jeśli jest zły to musiał by tak zrobić ;)

Tak czy inaczej dzięki za odp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1