pivot błąd puste komórki

pivot błąd puste komórki
SA
  • Rejestracja:prawie 22 lata
  • Ostatnio:prawie 6 lat
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

Kopiuj
 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

Kopiuj
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ź

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
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ęść:

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

na:

Kopiuj
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.

SA
  • Rejestracja:prawie 22 lata
  • Ostatnio:prawie 6 lat
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

edytowany 1x, ostatnio: sablik
BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
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:

Kopiuj
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
SA
  • Rejestracja:prawie 22 lata
  • Ostatnio:prawie 6 lat
0

Witam dołożenie

Kopiuj
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.

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:dzień
  • Postów:2792
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.

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
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 ?

Kopiuj
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 ?

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:dzień
  • Postów:2792
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.

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
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 00:00:01' and '2019-03-09 22:12:11' "

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 22:12:11' 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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)