Is it possible to make an aggregate function without break / divided the grouping fields? I make a query but it will divided into duplicate value in the first field, here is my query:
x
SELECT TOP 5 empname AS 'EMP Name',
SUM (CASE WHEN prod = 'P' THEN 1 ELSE 0 END) AS 'Count of Prod',
COUNT (prod) AS 'Total Account',
FORMAT (COALESCE (SUM (CASE WHEN prod = 'P' THEN 1 ELSE 0 END) / COUNT (prod), 0), 'P') AS '% Prod',
DATEDIFF(DAY, t_start, t_end) as 'Duration Trip'
FROM Sampletable
WHERE empname NOT IN ('NA') AND
empname IS NOT NULL AND
t_end IS NOT NULL
GROUP BY empname,
prod,
t_end,
t_start
ORDER BY [Count of Prod] DESC
My expected result:
Emp. Name | Count of Prod | Total Account | % Prod | Duration Trip |
---|---|---|---|---|
Emp.1 | 62 | 63 | 98,41% | 30 |
Emp.2 | 45 | 48 | 93,75% | 28 |
Emp.3 | 20 | 22 | 90,91% | 25 |
Emp.4 | 20 | 24 | 83,33% | 22 |
Emp.5 | 15 | 19 | 78,95% | 20 |
Thank you in advance.
Advertisement
Answer
If you want one row per empname
, then that should be the only column in the group by
(or perhaps other columns that describe each employee without multiplying the number of rows).
That suggests something like this:
SELECT TOP 5 empname,
SUM(CASE WHEN prod = 'P' THEN 1 ELSE 0 END) AS prod_count,
COUNT prod) AS Total_Account,
FORMAT(AVG(CASE WHEN prod = 'P' THEN 1.0 ELSE 0 END), '%P') AS prod_ratio,
SUM(DATEDIFF(DAY, t_start, t_end)) as trip_duration
FROM Sampletable
WHERE empname NOT IN ('NA') AND
empname IS NOT NULL AND
t_end IS NOT NULL
GROUP BY empname
ORDER BY prod_count DESC;
Note some of the changes to the query:
- The column aliases are simplified so no escape characters are needed.
- The
GROUP BY
has onlyempname
. - The logic for the proportion of products is simplified using
AVG()
. - I assume that the trip duration should be a sum of the individual durations.
- I did not remove it, but
empname IS NOT NULL
is redundant, because theNOT IN
handles this.