I have the following code that displays strange output,
I’ve previously thought MIN/MAX SHOULD display same results when there is only one record in the given group .
The result for MONTH_2 and MONTH_4 is 0,0 for MIN 2,5 for MAX a clarification for this behavior would be appreciated
CREATE TABLE #CUST_ITEM (CUSTNMBR CHAR(31),ITEM CHAR(20),[MONTH] TINYINT,TOT_QTY DECIMAL(10,2))
INSERT INTO #CUST_ITEM VALUES('BA000057','BKNGPDR100',2,200)
INSERT INTO #CUST_ITEM VALUES('BA000057','BKNGPDR100',4,5000)
--QUERY_1 WITH AGGREGATE MIN
SELECT CUSTNMBR,ITEM,
MIN(CASE WHEN [MONTH] =2 THEN TOT_QTY ELSE 0 END) AS MONTH_2,
MIN(CASE WHEN [MONTH] =4 THEN TOT_QTY ELSE 0 END) AS MONTH_4,
MIN(CASE WHEN [MONTH] =5 THEN TOT_QTY ELSE 0 END) AS MONTH_5,
SUM(TOT_QTY) AS TOT_QTY_YEAR
FROM
#CUST_ITEM
GROUP BY CUSTNMBR,ITEM
--QUERY_2 WITH AGGREGATE MAX
SELECT CUSTNMBR,ITEM,
MAX(CASE WHEN [MONTH] =2 THEN TOT_QTY ELSE 0 END) AS MONTH_2,
MAX(CASE WHEN [MONTH] =4 THEN TOT_QTY ELSE 0 END) AS MONTH_4,
MAX(CASE WHEN [MONTH] =5 THEN TOT_QTY ELSE 0 END) AS MONTH_5,
SUM(TOT_QTY) AS TOT_QTY_YEAR
FROM
#CUST_ITEM
GROUP BY CUSTNMBR,ITEM
DROP TABLE #CUST_ITEM
Thanks in advance
It’s your case statements.
When you write
MIN(CASE WHEN [MONTH] =2 THEN TOT_QTY ELSE 0 END) AS MONTH_2,It takes the MINIMUM value of either 0 or tot_qty, which is gonna be 0 unless tot_qty is negative.
Use
NULLinstead of 0, like:NULLis ignored for aggregate functions which I think is what you want.