简体   繁体   中英

Perform aggregate functions on expressions that contain aggregates or subqueries

I have the problem when I want to add more CASES in my SQL but it seems SQL Server does not allow that.

What I want is that if BR.CUSTOMER_ID is not 10000 and BR.CUSTOMER_ID exists in [dbo].[LAMS_USER_METER] then do the sum() .

DECLARE @SELLING_WATER_RECORD_TABLE TABLE(
    OBJECT_ID INT,
    YEAR_MONTH INT,
    SELLING_WATER DECIMAL(18,3),
    IC_SELLING_WATER DECIMAL(18,3)
)       

INSERT INTO @SELLING_WATER_RECORD_TABLE
SELECT AYMT.OBJECT_ID,AYMT.YEAR_MONTH,
--below has the error
SUM(CASE BR.RECORD_TYPE WHEN '10000' THEN 0 ELSE 
        CASE  WHEN BR.CUSTOMER_ID IN (SELECT DISTINCT  CUSTOMER_ID FROM [dbo].[LAMS_USER_METER])
                   THEN BR.READ_WATER 
              ELSE 0
         END
        
    END),

SUM(CASE BR.RECORD_TYPE WHEN '10000' THEN BR.READ_WATER ELSE 0 END),

FROM @AREA_YEAR_MONTH_TABLE AYMT
INNER JOIN [dbo].[AREA_BMMETER_CHECK] ABC 
ON AYMT.OBJECT_ID=ABC.OBJECT_ID 
INNER JOIN [dbo].[BM_METERINFO] BM 
ON ABC.VIRTUAL_METER_ID=BM.VIRTUAL_METER_ID 
INNER JOIN [dbo].[BM_RECORDINFO] BR
ON BM.CUSTOMER_ID=BR.CUSTOMER_ID AND BM.METER_ID=BR.METER_ID AND AYMT.YEAR_MONTH='202012'

GROUP BY AYMT.OBJECT_ID,AYMT.YEAR_MONTH;

select * from @SELLING_WATER_RECORD_TABLE

I find the solution to use LEFT JOIN like this:

DECLARE @SELLING_WATER_RECORD_TABLE TABLE(
    OBJECT_ID INT,
    YEAR_MONTH INT,
    SELLING_WATER DECIMAL(18,3),
    IC_SELLING_WATER DECIMAL(18,3)
    
)

INSERT INTO @SELLING_WATER_RECORD_TABLE
SELECT AYMT.OBJECT_ID,AYMT.YEAR_MONTH,

SUM(CASE BR.RECORD_TYPE WHEN '10000' THEN 0 ELSE 
        CASE  WHEN LUM.CUSTOMER_ID IS NOT NULL
                   THEN BR.READ_WATER 
              ELSE 0
         END
        
    END),
    

SUM(CASE BR.RECORD_TYPE WHEN '10000' THEN BR.READ_WATER ELSE 0 END)
) 
FROM @AREA_YEAR_MONTH_TABLE AYMT
INNER JOIN [dbo].[AREA_BMMETER_CHECK] ABC 
ON AYMT.OBJECT_ID=ABC.OBJECT_ID
INNER JOIN [dbo].[BM_METERINFO] BM 
ON ABC.VIRTUAL_METER_ID=BM.VIRTUAL_METER_ID 
INNER JOIN [dbo].[BM_RECORDINFO] BR
ON BM.CUSTOMER_ID=BR.CUSTOMER_ID AND BM.METER_ID=BR.METER_ID AND   AYMT.YEAR_MONTH=BR.BILLING_MONTH

LEFT JOIN LAMS_USER_METER LUM
ON BR.CUSTOMER_ID = LUM.CUSTOMER_ID

GROUP BY AYMT.OBJECT_ID,AYMT.YEAR_MONTH;

select * from @SELLING_WATER_RECORD_TABLE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM