Saya memiliki kueri dengan beberapa pernyataan kasus tetapi ingin mereka ditampilkan dalam 1 baris dan bukan dikelompokkan berdasarkan kualifikasi dalam setiap pernyataan kasus. Jam ditandai dalam kolom jam, tetapi sedikit untuk menandai apakah jam ST vs PL

Saya telah mencoba meletakkan jumlah atau maks di depan pernyataan kasus, tetapi kemudian mendapatkan kesalahan. "Tidak dapat melakukan fungsi agregat pada ekspresi yang berisi agregat atau subkueri"

declare @StartDate as date
declare @EndDate as date
set @StartDate = '7/1/2019'
set @EndDate = '7/31/2019'

SELECT  js.City,
        ro.Name,    
        --sum(case when hw.overtime = 0 then SUM(hw.Hours) else 0 end) AS STHoursworked, 
        (case when hw.overtime = 0 then SUM(hw.Hours) else 0 end) AS STHoursworked, 
        --sum(case when hw.overtime = 1 then SUM(hw.Hours) else 0 end) AS OTHoursworked, 
        (case when hw.overtime = 1 then SUM(hw.Hours) else 0 end) AS OTHoursworked, 
        sum(hw.hours) as TotalHours
FROM            Manager.HoursInvoiced AS hw INNER JOIN
                         Manager.PayrollRecord AS pr ON hw.PayrollEntityOID = pr.EntityOID INNER JOIN
                         Manager.ClientAccounts AS ca ON pr.AccountEntityOID = ca.EntityOID INNER JOIN
                         Manager.Clients AS c ON ca.ClientEntityOID = c.EntityOID INNER JOIN
                         Manager.Assignments AS ass ON pr.AssignmentEntityOID = ass.EntityOID INNER JOIN
                         Manager.JobSites AS js ON ass.JobSiteEntityOID = js.EntityOID INNER JOIN
                         Manager.Role AS ro ON ass.RoleEntityOID = ro.EntityOID
WHERE        (c.EntityOID = 'D6F3BC50-B60E-4DA4-9F3E-DACE78FD0EE2') AND (hw.WorkDate BETWEEN @StartDate AND @EndDate)
GROUP BY    hw.Overtime, 
            js.city,
            ro.Name 
order by js.City,ro.Name

enter image description here

enter image description here

Saya ingin STHours dan OTHours untuk Conroe/Administratif berada di baris yang sama. Saya tidak dapat menghapus grup menurut, dan saya tidak dapat menggunakan fungsi maks atau jumlah di depan pernyataan kasus.

Pesan 8120, Level 16, Status 1, Baris 10 Kolom 'Manager.HoursInvoiced.Overtime' tidak valid dalam daftar pilih karena tidak terdapat dalam fungsi agregat atau klausa GROUP BY.

sql
1
Steve B 7 Agustus 2019, 02:00

1 menjawab

Jawaban Terbaik

Yang Anda butuhkan adalah ekspresi case di dalam penjumlahan. Anda ingin pengelompokan tingkat terendah berisi baris jenis lembur dan non-lembur, Anda hanya ingin mengabaikannya secara selektif dalam berbagai total.

Kesalahan sintaks yang Anda terima adalah hasil dari mencoba menjumlahkan jumlah. (Anda mungkin mengalami ini dalam pengaturan fungsi analitik tetapi dalam hal ini Anda tidak dapat melakukannya di sini.)

select js.City, ro.Name,    
    sum(case when hw.overtime = 0 then hw.Hours else 0 end) AS STHoursworked, 
    sum(case when hw.overtime = 1 then hw.Hours else 0 end) AS OTHoursworked, 
    sum(hw.hours) as TotalHours
from ...
group by js.city, ro.Name 
order by js.City, ro.Name;
1
shawnt00 6 Agustus 2019, 23:21