I have the following table called designerindices
I want to do the sum and the pseudo code as below
SUM(duration1) WHERE designer1 = X AND designerHistSrNumber = 16
SUM(duration2) WHERE designer2 = X AND designerHistSrNumber = 16
SUM(duration3) WHERE designer3 = X AND designerHistSrNumber = 16
SUM(duration4) WHERE designer 4 = X AND designerHistSrNumber = 16
To do that I wrote the following 4 separate queries
SELECT SUM(duration1) as sumdur1 FROM designerindices WHERE designerHistSrNumber = 16 AND designer1 = "X"
This should output 10
SELECT SUM(duration2) as sumdur2 FROM designerindices WHERE designerHistSrNumber = 16 AND designer2 = "X"
This should output 2.4
SELECT SUM(duration3) as sumdur3 FROM designerindices WHERE designerHistSrNumber = 16 AND designer3 = "X"
This should output 5
SELECT SUM(duration4) as sumdur4 FROM designerindices WHERE designerHistSrNumber = 16 AND designer4 = "X"
This should output 1.1
I have to execute the above queries 4 times. The finally add sumdur1 sumdur2 sumdur3 sumdur4. The total should be 18.5
Is there any easy and direct way to do this instead of doing the above way?
CodePudding user response:
You can wrap all your 4 queries in seperate Select clause and have addition in that, like
Select (
(SELECT SUM(duration1) as sumdur1 FROM designerindices WHERE designerHistSrNumber = 16 AND designer1 = "X")
(SELECT SUM(duration2) as sumdur2 FROM designerindices WHERE designerHistSrNumber = 16 AND designer1 = "X")
(SELECT SUM(duration3) as sumdur3 FROM designerindices WHERE designerHistSrNumber = 16 AND designer1 = "X")
(SELECT SUM(duration4) as sumdur4 FROM designerindices WHERE designerHistSrNumber = 16 AND designer1 = "X")
) from Dual;
CodePudding user response:
What you want here generally is called conditional aggregation:
SELECT
SUM(CASE WHEN designer1 = 'X' THEN duration1 ELSE 0 END) AS dur1,
SUM(CASE WHEN designer2 = 'X' THEN duration2 ELSE 0 END) AS dur2,
SUM(CASE WHEN designer3 = 'X' THEN duration3 ELSE 0 END) AS dur3,
SUM(CASE WHEN designer4 = 'X' THEN duration4 ELSE 0 END) AS dur4
FROM yourTable
WHERE
designerHistSrNumber = 16
CodePudding user response:
Why not just select the individual SUMS:
SELECT
SUM(duration),
SUM(duration2),
SUM(duration3),
SUM(duration4)
FROM
designerindices
WHERE
designerHistSrNumber=16 AND designer1="X"
This will sum the individual columns, but only for rows that match the WHERE clause. Since you want the same WHERE clause for each SUM(), you can just specify it once.

