Reputation: 375
I Have a production table with this column:
PRODUCTION_DATE EMPLOYEE ITEM ITEM_QTY
-----------------------------------------
1/1/2000 ANA A 5
1/1/2000 ANA B 8
1/1/2000 CAROL A 3
1/1/2000 CAROL B 9
1/2/2000 ANA A 4
1/2/2000 ANA B 8
1/2/2000 CAROL A 5
1/2/2000 CAROL B 7
And then I to group this data weekly with this code:
SELECT DATEPART(WK,[PRODUCTION_DATE]) AS [WEEK_PROD],
[EMPLOYEE],
[ITEM],
SUM([ITEM_QTY]) AS [TOTAL_QTY],
FROM PRODUCTION_TABLE
GROUP BY YEAR([PRODUCTION_DATE]),
DATEPART(WK,[PRODUCTION_DATE]),
[EMPLOYEE],
[ITEM]
With that code above, I can show data like this:
WEEK_PROD EMPLOYEE ITEM TOTAL_QTY
-------------------------------------
1 ANA A 9
1 ANA B 16
1 CAROL A 8
1 CAROL B 16
The problem is, I want to show percent for each item by employee like this:
WEEK_PROD EMPLOYEE ITEM TOTAL_QTY PERCENTAGE
------------------------------------------------
1 ANA A 9 36
1 ANA B 16 64
1 CAROL A 8 33.33
1 CAROL B 16 66.67
How can I do that?
Thanks in advance
Upvotes: 0
Views: 102
Reputation: 3669
Window functions can help here and in my opinion it's more natural than query expression.
SELECT DISTINCT DATEPART(WK,[PRODUCTION_DATE]) AS [WEEK_PROD],
[EMPLOYEE],
[ITEM],
SUM([ITEM_QTY]) OVER(PARTITION BY EMPLOYEE, ITEM) AS [TOTAL_QTY],
SUM([ITEM_QTY]) OVER(PARTITION BY EMPLOYEE, ITEM) * 1.0 / SUM([ITEM_QTY]) OVER(PARTITION BY EMPLOYEE) AS [PERCENTAGE]
FROM dbo.PRODUCTION_TABLE
Upvotes: 1
Reputation: 5060
This is a query which only add a super query to your (unchanged, in the inner part):
SELECT A.*
, (TOTAL_QTY+0.00)/SUM(TOTAL_QTY) OVER (PARTITION BY EMPLOYEE) *100 AS PERC
FROM
(SELECT DATEPART(WK,[PRODUCTION_DATE]) AS [WEEK_PROD],
[EMPLOYEE],
[ITEM],
SUM([ITEM_QTY]) AS [TOTAL_QTY]
FROM mytable
GROUP BY YEAR([PRODUCTION_DATE]),
DATEPART(WK,[PRODUCTION_DATE]),
[EMPLOYEE],
[ITEM]
) A
Output:
WEEK_PROD EMPLOYEE ITEM TOTAL_QTY PERC
----------- -------- ---- ----------- ---------------------------------------
1 ANA A 9 36.0000000000000
1 ANA B 16 64.0000000000000
1 CAROL A 8 33.3333333333300
1 CAROL B 16 66.6666666666600
Upvotes: 0
Reputation: 4192
Use sub query in JOIN statement :
SELECT [EMPLOYEE],[ITEM],SUM([ITEM_QTY]) AS [TOTAL_QTY],
(SUM([ITEM_QTY]) * 100) / Total
FROM #Table
JOIN
(
SELECT [EMPLOYEE] _EMPLOYEE ,SUM([ITEM_QTY]) Total
FROM #Table
GROUP BY [EMPLOYEE]
) A ON EMPLOYEE = _EMPLOYEE
GROUP BY [EMPLOYEE],[ITEM],Total
Upvotes: 0
Reputation: 409
Try this query,
;WITH [CTE_EMP]
AS
(
SELECT DATEPART(WK,[PRODUCTION_DATE]) AS [WEEK_PROD],
[EMPLOYEE],
[ITEM],
SUM([ITEM_QTY]) AS [TOTAL_QTY]
FROM @PRODUCTION_TABLE
GROUP BY YEAR([PRODUCTION_DATE]),
DATEPART(WK,[PRODUCTION_DATE]),
[EMPLOYEE],
[ITEM]
)
SELECT *, ([TOTAL_QTY] * 100) / SUM([TOTAL_QTY]) OVER (PARTITION BY [EMPLOYEE],[WEEK_PROD]) AS [PERCENTAGE]
FROM [CTE_EMP]
Upvotes: 0