MS SQL pętla/warunek

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ę:

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#

2
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 )
0

Już wszystko działa jak nalezy

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

0

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

 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)
1
-- 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())))
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

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.

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