SQL Server连接和查询问题

SQL Server连接和查询问题,sql,sql-server,database,Sql,Sql Server,Database,我有一个由以下字段组成的账单历史记录表 CREATE TABLE [dbo].[BILLING_HISTORY2]( [ID] [int] IDENTITY(1,1) NOT NULL, [READING_MONTH_YEAR] [date] NULL, [READING] [int] NULL, [CONSUMER_ID] [int] NULL, [payment_status] [bit] NOT NULL ) 以下查询返回消费者的最大已付和最大未付值 SELECT MAX(READI

我有一个由以下字段组成的账单历史记录表

CREATE TABLE [dbo].[BILLING_HISTORY2](
[ID] [int] IDENTITY(1,1) NOT NULL,
[READING_MONTH_YEAR] [date] NULL,
[READING] [int] NULL,
[CONSUMER_ID] [int] NULL,
[payment_status] [bit] NOT NULL
) 

以下查询返回消费者的最大已付和最大未付值

SELECT MAX(READING) AS 'MAXIMUM_PAID_READING',consumer_id from billing_history2
where payment_status=0 GROUP BY consumer_id;

SELECT MAX(READING) AS 'MAXIMUM_UNPAID_READING',consumer_id from billing_history2
where payment_status=1 GROUP BY consumer_id;
然而,当我加入它们,从最大未付读数中减去最大已付读数,得到当前读数时,通过加入上述两个查询,它会返回所有具有匹配消费者id的记录。因此,如果消费者尚未支付任何账单,id将在付费读取中被忽略,因此内部联接不会返回任何结果。如果使用完全外部联接,它将返回所有记录,但将差异设置为NULL

我需要从以前的未付使用量中减去客户的当前使用量

我如何将这两个问题结合起来,以便无论此人过去是否支付过账单,都能发现由此产生的差异

不要加入他们

SELECT
    MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END) AS 'MAXIMUM_PAID_READING',
    MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END) AS 'MAXIMUM_UNPAID_READING',

    MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END)
     - MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END)
        AS 'DIFF_READING',

    consumer_id from billing_history2
GROUP BY consumer_id;
如果要从MAX函数处理空值,请使用ISNULL函数:

SELECT
    ISNULL(MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END),0) AS 'MAXIMUM_PAID_READING',
    ISNULL(MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END),0) AS 'MAXIMUM_UNPAID_READING',

    ISNULL(MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END),0)
     - ISNULL(MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END),0)
        AS 'DIFF_READING',

    consumer_id from billing_history2
GROUP BY consumer_id;

可以使用左外联接,但在最大值上使用isnull

例:


在您的情况下,必须使用表达式

SELECT CONSUMER_ID,
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) AS 'MAXIMUM_PAID_READING',
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS 'MAXIMUM_UNPAID_READING', 
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) - 
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS diff
FROM billing_history2
GROUP BY consumer_id
演示

SELECT CONSUMER_ID,
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) AS 'MAXIMUM_PAID_READING',
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS 'MAXIMUM_UNPAID_READING', 
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) - 
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS diff
FROM billing_history2
GROUP BY consumer_id