łączenie w jeden raport wielokrotnego zapytanie do tej samej tabeli

Odpowiedz Nowy wątek
2018-02-08 11:45
Marian
0

Witam wszystkich!

Otóż mam tabelę na SQL Express, która ma strukturę mniej więcej taką

ID - int
LUD - datetime
WADA_1 - bit
WADA_2 - bit
..
WADA_N - bit

jest to log z maszyny produkcyjnej.

Potrzebuję wykonać raport, który pogrupuje i policzy wady o wartości 1 dla poszczególnych tygodni w roku

ROK | TYDZIEŃ | WADA_1 | WADA_2 | ... | WADA_N |

Jak to zrobić?

Pozostało 580 znaków

2018-02-08 14:36
Marian
0
woolfik napisał(a):

Skąd rozbieżności? Teoretycznie COUNT i SUM powinny policzyć to samo...

No to pojechałeś ...
No ale skoro pytasz ... to Ci odpowiem. W pierwszym zapytaniu robisz selecta z całej tabeli, grupujesz i jeśli jakiś tam warunek jest spełniony to dajesz 1 lub 0, potem sumujesz wszystkie rekordy, W drugim zapytaniu robisz selecta do części tabeli WHERE (LeftCenteringNotOK = 1) OR (RightCenteringNotOK = 1) i zliczasz ilość wystąpień

Wydaje mi się, że różnicę między COUNT i SUM to jeszcze w miarę ogarniam ;)
Nie rozumiem natomiast dlaczego zapytania dają inny wynik skoro w obu chcę zliczać te wystąpienia w których WADA_1 lub WADA_2 jest równa 1? Bo nie sądzę aby problemem był przypadek gdy obie wady mają wartość 1..

Bo SUM sumuje, to dodawanie, a COUNT zlicza ilość wystąpień. Jak masz tabelę w której masz powiedzmy ilość faktur które zostały wystawione dla jednej osoby w przedziale czasowym to będziesz miał firma_x = 2, firma_y = 5, firma_z = 15. Sum zrobi Ci sumę czyli 2+5+15, Count policzy 3. Dlaczego ano dlatego że masz 3 wpisy za ten czas. - kate87 2018-02-08 15:21
lepiej bym tego nie ujął :) - woolfik 2018-02-08 15:47

Pozostało 580 znaków

2018-02-08 16:55
Marian
0

Jestem początkujący, ale takich rzeczy mi nie tłumaczcie 😁 Ja to rozumiem.
Problem w tym, że ja sumuję pola typu bit, a one mogą mieć wartość 0 lub 1. Poza tym w warunku podaję, że chcę zsumować tylko pola o wartości 1. Ten sam warunek podaję dla Count. Czemu więc mam inny wynik?

Pozostało 580 znaków

2018-02-09 09:49
0

Pokaż kod dla 1 i 2 (sformatowany!) i może przykładowe dane...

Pozostało 580 znaków

2018-02-09 13:40
0
Marian napisał(a):

Jestem początkujący, ale takich rzeczy mi nie tłumaczcie 😁 Ja to rozumiem.
Problem w tym, że ja sumuję pola typu bit, a one mogą mieć wartość 0 lub 1. Poza tym w warunku podaję, że chcę zsumować tylko pola o wartości 1. Ten sam warunek podaję dla Count. Czemu więc mam inny wynik?

Masakra z każdym postem coraz bardziej strzelasz sobie w kolano ... w oracle nie ma czegoś takiego jak BIT tego typu pole występuje w MSSQL. Natomiast oracle posiada trójwartościową logikę czyli 0, 1 i NULL. W tym momencie napiszę też pewnie oczywistą dla Ciebie rzecz ALE 0 i NULL to nie to samo dla bazy oracle ... póki nie pokażesz struktury tabel to nie będę w stanie podać dokładnej odpowiedzi dlaczego ale na to co napisałeś wydaje mi się, że przyczyną jest to, że do zapytania wpada inny zakres rekordów więc i suma jest inna.

edytowany 1x, ostatnio: woolfik, 2018-02-09 13:41
W pierwszym poście pisał o "SQL Express" - ale, że autor miesza się w zeznaniach może z czasem w postach zmieniał na Oracle ? Tak czy inaczej stawiam raczej na "że przyczyną jest to, że do zapytania wpada inny zakres rekordów więc i suma jest inna." - dla tego też prosiłem o dane ;) Zobaczmy co dostaniemy. - BlackBad 2018-02-09 13:48
Przyczyna może też być inna - baza jest "żywa" - wciąż się coś zmienia. Zwłaszcza, że jak zsumuje się wyniki Count i Sum, to różnica jest o 1. - Marcin.Miga 2018-02-09 14:48
Moze tak być ale raczej wygląda to na jakiś projekt studencki - woolfik 2018-02-09 16:18

Pozostało 580 znaków

2018-02-12 11:02
Marian
0

Witam po weekendzie :)

Dzięki za wszystkie uwagi

woolfik
Mówimy o SQL Express. Nowy wspominał o Oracle
Lubię swoje kolana i nie zwykłem do nich strzelać - NULL i 0 rozróżniam.
Nie, nie jest to projekt studencki - dostaliśmy maszynę z dedykowaną bazą danych, a że zasobów w postaci informatyka od baz danych w firmie brak - sam rzeźbię (jestem inżynierem produkcji).

BlackBad
Struktura tabeli i zapytania - poniżej.
Tabele z wynikami umieściłem pod zapytaniami
(tydzień 6 usunąłem ponieważ zmieniał się z godziny na godzinę, bo maszyna cały czas produkuje).

Tak więc dzisiaj oba zapytania generują ten sam wynik, co z jednej strony mnie cieszy, bo tego oczekiwałem. Z drugiej strony - nie wiem dlaczego :(

Struktura tabeli T_Datalog_Master:

Column Name Data Type Allow Nulls
ID int Unchecked
LOT varchar(30) Unchecked
SERIAL_NUMBER varchar(30) Unchecked
LUD datetime Unchecked
ScrapResistance bit Checked
LeftMgoDepth int Checked
RightMgoDepth int Checked
LeftCapSize int Checked
RigthCapSize int Checked
LeftOhmTestDone bit Checked
LeftOhmTestNotOK bit Checked
LeftInsTestDone bit Checked
LeftInsTestNotOK bit Checked
LeftR2TestDone bit Checked
LeftR2TestNotOK bit Checked
LeftR1TestDone bit Checked
LeftR1TestNotOK bit Checked
LeftCapDone bit Checked
LeftCapNotOK bit Checked
LeftConingDone bit Checked
LeftConingNotOK bit Checked
LeftMgoCtrlDone bit Checked
LeftMgoCtrlNotOK bit Checked
LeftCleaningDone bit Checked
LeftCleaningNotOK bit Checked
LeftCenteringDone bit Checked
LeftCenteringNotOK bit Checked
LeftCutDone bit Checked
LeftPinCtrlDone bit Checked
LeftPinCtrlNotOK bit Checked
LeftChamperingDone bit Checked
LeftChamperingNotOK bit Checked
RightOhmTestDone bit Checked
RightOhmTestNotOK bit Checked
RightInsTestDone bit Checked
RightInsTestNotOK bit Checked
RightR2TestDone bit Checked
RightR2TestNotOK bit Checked
RightR1TestDone bit Checked
RightR1TestNotOK bit Checked
RightCapDone bit Checked
RightCapNotOK bit Checked
RightConingDone bit Checked
RightConingNotOK bit Checked
RightMgoCtrlDone bit Checked
RightMgoCtrlNotOK bit Checked
RightCleaningDone bit Checked
RightCleaningNotOK bit Checked
RightCenteringDone bit Checked
RightCenteringNotOK bit Checked
RightCutDone bit Checked
RightPinCtrlDone bit Checked
RightPinCtrlNotOK bit Checked
RightChamperingDone bit Checked
RightChamperingNotOK bit Checked

Zapytanie pierwsze:

`SET` datefirst 1; -- w zależnosci od ustawien jezyka

`SELECT` datepart(yy,lud) as Rok, datepart(ww, LUD) as Tydzień, 
    SUM(CASE WHEN  LeftCenteringNotOK=1 or RightCenteringNotOK=1 THEN 1 ELSE 0 END) Centrowanie_Braki
`FROM` dbo.T_DATALOG_MASTER
`GROUP` `BY` datepart(yyyy,lud), datepart(week, LUD)
`ORDER` `BY` Rok, Tydzień

Wynik zapytania z 8-02 13:35

Rok Tydzień Centrowanie_Braki
2018 4 687
2018 5 307

Wynik zapytania z 12-02 8:10

Rok Tydzień Centrowanie_Braki
2018 4 687
2018 5 307

Zapytanie drugie:

`SELECT` datepart(yy,lud) as Rok, datepart(ww, LUD) as Tydzień, COUNT(ID) AS Centrowanie_Braki
`FROM` dbo.T_DATALOG_MASTER
`WHERE` (LeftCenteringNotOK=1 or RightCenteringNotOK=1)
`GROUP` `BY` datepart(yyyy,lud), datepart(week, LUD)
`ORDER` `BY` Rok, Tydzień

Wynik zapytania z 8-02 13:36

Rok Tydzień Centrowanie_Braki
2018 4 613
2018 5 330

Wynik zapytania z 12-02 8:11

Rok Tydzień Centrowanie_Braki
2018 4 687
2018 5 307

Pozostało 580 znaków

2018-02-12 19:23
1

Nie mam dziś za grosz czasu ... 1 strzał po rzuceniu okiem tylko, dodaj przed 2 zapytaniem tą część:

`SET` datefirst 1;

Ta linijka określa jak są liczone dni tygodnia raz to ustawiasz za drugim razem nie (jest brana wartość domyślna ustawień języka/regionu systemu).

Pozostało 580 znaków

2018-02-13 12:40
0

BlackBad jesteś wielki!

Dzisiaj znów miałem duże różnice w obu zapytaniach, po wstawieniu sugerowanej linijki - pokazuje to samo.
Serdeczne dzięki.

Pozostało 580 znaków

2018-02-13 16:28
0

Fajnie, fajnie. To już z kronikarskiego obowiązku napiszmy o co cho.

`SET` datefirst 1; -- oznacza licz tydzień od "Poniedziałku"
`SET` datefirst 7; -- oznacza licz tydzień od "Niedzieli" - i to jest ustawienie domyślne dla US

Pozostało 580 znaków

2018-02-13 23:21
0

To już sobie doczytałem, ale dzięki. :)

Jeszcze jedno pytanie mi się nasunęło:
Jak ten raport pogrupować nie tylko po tygodniach, ale po dniach i zmianach (6-14, 14-22, 22-6)?

edytowany 1x, ostatnio: Marian_Z, 2018-02-14 07:18

Pozostało 580 znaków

2018-02-14 12:20
0

Znów CASE i sprawdzenie godziny i ustawienie odpowiedniej wartości:

SET datefirst 1; -- w zależnosci od ustawien jezyka
 
WITH tempTable AS
(
SELECT datepart(yy,lud) AS Rok, datepart(ww, LUD) AS Tydzień, 
CASE WHEN datepart(HOUR,lud) BETWEEN 6 AND 13 THEN '6-14'
           WHEN datepart(HOUR,lud) BETWEEN 14 AND 21 THEN '14-22' 
           WHEN datepart(HOUR,lud) BETWEEN 22 AND 24 OR datepart(HOUR,lud) BETWEEN 0 AND 5 THEN '22-6'
END AS Zmiana,
SUM(CASE WHEN  LeftCenteringNotOK=1 OR RightCenteringNotOK=1 THEN 1 ELSE 0 END) Centrowanie_Braki
FROM dbo.T_DATALOG_MASTER
)
 
SELECT Rok, Tydzień, Zmiana, Centrowanie_Braki FROM tempTable
GROUP BY Rok, Tydzień, Zmiana
ORDER BY Rok, Tydzień, Zmiana
edytowany 3x, ostatnio: BlackBad, 2018-02-14 12:56
Dzięki Marcin słuszna uwaga - siedzenie na zwolnieniu w chacie mi nie służy :( Poprawiam kod w odpowiedzi ;) - BlackBad 2018-02-14 12:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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