MS SQL pętla/warunek

MS SQL pętla/warunek
MP
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:43
0

Cześć,
Mam bazę MS SQL a w niej dane z w jednej tabeli z różnych urządzeń. Oznaczonych 1,2,3…
stausjąc instrukcję:

Kopiuj
SELECT 
CAST (SUM(Weight) AS DECIMAL(10,2)) AS 'Produkacja [t]'
  FROM [TMSCLIENT4].[dbo].[vwConveyorScaleMinute]

  WHERE VehicleId =1
  AND WorkDateTime BETWEEN '2021-08-16 01:00:00.000' AND '2021-08-16 23:00:00.000'

otrzymujemy:
screenshot-20211220134136.png

Czy jest jakaś pętla która mogła by wygenerować sumowane wartości dla kilku urządzeń jednocześnie ? aby to wyglądało :

screenshot-20211220134201.png

Problem polega na tym iż użytkownik w programie będzie mógł zaznaczyć czy chce zobaczyć wszystkie maszyny czy tylko wybrane.
oraz aby zamiast nazw 1,2,3 wstawić już konkretne nazwy urzadzęń : Pierwsza, druga, itp.
Czy da się ten problem tak to rozwiązać aby wygenerować taka tabelę w sql? a później tylko zaimportować ją do DataGridView ?

Dodam że program pisze w c#

abrakadaber
abrakadaber
Szusta jest najlepsza :)
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
2
Kopiuj
SELECT 
CAST (SUM(Weight) AS DECIMAL(10,2)) AS 'Produkacja [t]', VehicleId, CONVERT(date, WorkDateTime )
  FROM [TMSCLIENT4].[dbo].[vwConveyorScaleMinute] 
  AND WorkDateTime BETWEEN '2021-08-16 01:00:00.000' AND '2021-08-16 23:00:00.000'

group by VehicleId, CONVERT(date, WorkDateTime )
MP
@UglyMan jak zawsze genialnie lecz, kod generuje wszytskie maszyny, co jeśli użytkownik wybierze maszynę 1 i 3 ?
Marcin.Miga
Jeśli użytkownik wybierze maszynę 1 i 3, to pewnie trzeba je do WHERE wpisać...
UglyMan
Dokładnie tak jak napisał @Marcin.Miga
MP
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:43
0

Już wszystko działa jak nalezy

Kopiuj
SELECT 
CAST (SUM(Weight) AS DECIMAL(10,2)) AS 'Produkacja [t]',
VehicleId,
CONVERT(date, WorkDateTime ) AS 'DATA'
FROM [TMSCLIENT4].[dbo].[vwConveyorScaleMinute] 
 WHERE WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-20 08:00:00.000'
 AND VehicleId IN ('1','2','4', '6')
 group by VehicleId,CONVERT(date, WorkDateTime )
ORDER BY VehicleId, CONVERT(date, WorkDateTime )

a taz chcę dodać możliwość pokazywania danych w dniach dodając DATEADD(DAY, DATEDIFF(DAY, 0, WorkDateTime), 0) as Dzień,
aby później była możliwość zmiany na tygodnie lub miesiace. Lecz nie chce mi to zadziałać. Mozecie coś podpowiedzieć jak to powinno wyglądać ?

MP
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:43
0

Oczywiście kod źródłowy do pokazania takich wyliczeń dla dnia, tygodnia czy miesiaca mam nastepujacy:

Kopiuj
 SELECT  
  
 DATEADD(DAY, DATEDIFF(DAY, 0, WorkDateTime), 0) as Dzień, 
   
CAST (SUM(Weight) AS DECIMAL(10,2)) AS 'Produkacja [t]',
AVG(CASE WHEN Weight > 1 THEN Performance ELSE 0 END ) AS 'Wydajność [t/h]'
     
FROM[TMSCLIENT4].[dbo].[vwConveyorScaleMinute]
  
WHERE   WorkDateTime BETWEEN '2021-09-16 01:00:00.000' AND '2021-09-20 23:00:00.000'
AND VehicleId =1
  
 GROUP BY dateadd(DAY, datediff(DAY, 0, WorkDateTime), 0) 
 ORDER BY dateadd(DAY, datediff(DAY, 0, WorkDateTime), 0)
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
1
Kopiuj
-- dla tygodnia
select trim(str(year(GetDate()))) + trim(str(DATEPART(ISO_WEEK, GetDate())))
--dla miesiąca 
select trim(str(year(GetDate()))) + trim(str(DATEPART(MONTH, GetDate())))
MP
@UglyMan kompletnie nie wiem jak ten trim ma sie znaleŹć w moim kodzie (Trim-usuwa puste znaki? ja tylko chce wyświetlić dane z kilku urządzeń jednoczesnie a nie usuwać znaki )
UglyMan
W ten sposób dostaniesz unikalny identyfikator dla tygodnia i dla miesiąca. Odpaliłeś to chociaż?
MP
  • Rejestracja:ponad 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:43
0

Chcę uzyskać taki efekt: Wartości podliczone za okres miesiąca (w przyszłości tez dla tygidnia i roku )
screenshot-20211221140713.png

Dletego nie za bardzo wiem jak ma mi trim pomóc w moim problemie.
Najlepiej było by jeśli można by przypisać do numerów maszym ich nazwy oraz w tabeli "OKRES " można było wpisac nazwy miesiaca lecz, nie wiem czy to jest możliwe

UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
0
Mlody_pb napisał(a):

Chcę uzyskać taki efekt: Wartości podliczone za okres miesiąca (w przyszłości tez dla tygidnia i roku )

screenshot-20211221140713.png

Dletego nie za bardzo wiem jak ma mi trim pomóc w moim problemie.
Najlepiej było by jeśli można by przypisać do numerów maszym ich nazwy oraz w tabeli "OKRES " można było wpisac nazwy miesiaca lecz, nie wiem czy to jest możliwe

Nie mam pojęcia, o co pytasz co chcesz zrobić, jak i dlaczego. Jak chcesz cos policzyć dla tygodnia czy miesiąca to musisz najpierw z daty wyciągnąć tę informację, a potem po niej pogrupować. Uznałem, że jak masz już dla dni obliczone to potrzebujesz tylko informacji jak wyciągnąć z daty tydzień i miesiąc.

MP
@UglyMan: Chcę uzyskać taka tabelkę jak wyżej, aby w miej były policzone wartości z całego miesiąca lub tygodnia dla poszczegulnych urządzeń. Potrafię to zrobić dla dla jedeego urządzenia, problem polega na tym iż nie wiem jak ugryść to z twoją podpowiedzią. Myślełem że z pomoca DATEADD będzie to najłatwiej bo tak robię dla jednej maszyny.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.