2013-02-18 226 views
2

我有包括以下字段SQL Server的加入和查询问题

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 
) 

http://www.sqlfiddle.com/#!3/892e0/5

下列查询的表billing_history返回MAX付费和最大未付价值的消费者

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; 

但是,当我加入它们从MAXIMUM_UNPAID_READING中减去MAXIMUM_PAID_READING以获取当前读数时,通过加入上述两个查询,结果返回所有具有匹配的consumer_id的记录。因此,如果消费者尚未支付任何账单,该ID将在PAID_READING中被省略,因此INNER JOIN不会返回任何结果。如果我使用FULL OUTER JOIN,它将返回所有记录,但将差异设置为NULL。

我需要通过从先前的未付使用中减去它来找出客户的当前使用情况。

我该如何去加入这两个查询,这样才能发现由此产生的差异,而不管这个人是否在过去支付账单。

回答

1

不要加入他们。

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功能NULL值,使用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; 
+0

由于它解决了这个问题 – user2018756 2013-02-18 09:52:57

0

这是确定使用左外连接,但在你的最大值使用ISNULL。

例如:

max(...) - isnull(max(...),0) as ... 
0

你的情况需要使用CASE表达

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 

演示上SQLFiddle