Ada kolom yang mewakili 24 jam. Data datang setiap 15 menit. Misalnya, pada 10:15, nilai dimasukkan di kolom DateTime dari kolom 10H. Tapi... Klien ingin menetapkan standar untuk hari itu pada pukul 6:30 pagi dan menetapkannya pada pukul 6:30 keesokan harinya. Jika Anda melihat kolom di bawah ini, harus menjumlahkan nilai dari kolom 6h.. Apakah ada cara?

DateTime             0H  1H   ..6H....7H...8H..9H..10H..~23H
2020 11 10 00:00:00  979 958 
2020 11 10 00:15:00  987 954 
2020 11 10 00:30:00  987 958 
2020 11 10 00:45:00  960 956 
2020 11 11 00:00:00    0 0 
2020 11 11 00:15:00    0 0 
2020 11 11 00:30:00    0 0 
2020 11 11 00:45:00    0 0 
2020 11 12 00:00:00  995 995 
2020 11 12 00:15:00  991 993 
2020 11 12 00:30:00 1000 993 
2020 11 12 00:45:00  993 996 

enter image description here

I want value
2020-11-15 06:30 ~ 2020-11-16 06:30 values sum
0
Devbreaker 20 November 2020, 03:28

1 menjawab

Jawaban Terbaik

Pertimbangkan untuk memecah blok jam menjadi segmen SELECT terpisah yang menambahkan kolom jam terkait. Kemudian, ikat semua bagian bersama-sama dengan UNION ALL. Terakhir, gabungkan semua blok jam untuk SUM final.

Di bawah ini jumlah semua nilai antara 2020-11-15 06:30 - 2020-11-16 06:30 (tidak termasuk batas atas). Pastikan untuk mengisi singkatan ... untuk kolom yang dibutuhkan:

SELECT SUM(sub.HoursTotal) AS DayTotal
FROM
   (
    -- PARTIAL HOUR - 6:30 AM - 6:45 AM
    SELECT [6h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-15 00:30:00' AND  
                              '2020 11-15 00:45:00'

    UNION ALL

    -- FULL HOURS - 7:00 AM - 23:00 PM
    SELECT [7h] + [8h] + ... + [23h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-15 00:00:00' AND  
                              '2020 11-15 00:45:00'

    UNION ALL

    -- FULL HOURS - 12:00 AM - 5:00 AM
    SELECT [0h] + [1h] + ... + [5h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-16 00:00:00' AND  
                              '2020 11-16 00:45:00'
 
    UNION ALL

    -- PARTIAL HOUR - 6:00 AM - 6:15 AM
    SELECT [6h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-16 00:00:00' AND  
                              '2020 11-16 00:15:00'
  ) sub

Tentu saja, idealnya tabel Anda mempertahankan struktur format panjang yang dinormalisasi dengan dua kolom untuk waktu dan nilai. Kemudian, kueri jauh lebih mudah:

logDateTimewithHour   Value
2020 11-15 00:00:00     ###
2020 11-15 00:15:00     ###
2020 11-15 00:30:00     ###
2020 11-15 00:45:00     ###
2020 11-15 01:00:00     ###
2020 11-15 01:15:00     ###
2020 11-15 01:30:00     ###
2020 11-15 01:45:00     ###
...                     ...
2020 11-16 22:00:00     ###
2020 11-16 22:15:00     ###
2020 11-16 22:30:00     ###
2020 11-16 22:45:00     ###
2020 11-16 23:00:00     ###
2020 11-16 23:15:00     ###
2020 11-16 23:30:00     ###
2020 11-16 23:45:00     ###
SELECT SUM(Value) AS DayTotal
FROM myLongTable
WHERE logDateTimewithHour BETWEEN '2020 11-15 06:30:00'
                              AND '2020 11-16 06:15:00'
0
Parfait 20 November 2020, 04:14