2015-08-26 84 views
0

付款表與多列,其中包括學生,價值Payment_type。 我想創建一個查詢,將計算值的總和,如果同一個學生的所有記錄只有NULL爲付款類型。 如果學生至少有一種不同於NULL的支付類型,則不應包含該學生。SQL:如何查找列中所有記錄具有相同值的值的總和?

例子:

Student  Payment  Value  Payment_type 
    1   1   100   NULL 
    1   2   200   NULL 
    2   1   200   NULL 
    3   1   150   Cash 
    2   2   100   Cash 
    3   2   200   NULL 
    1   3   200   NULL 

如果你看一下例子,它應該給我造成500,因爲學生1的值的總和是500,和他/她的所有支付類型是NULL。

+0

哪些DBMS您使用的? Postgres的?甲骨文? –

回答

1
select student, sum(value) 
from payments 
group by student 
having sum(case when Payment_type is not null then 1 else 0 end) = 0 
+0

它的工作,謝謝。 如果我想添加一個更多的過濾條件,如 哪裏年= 2015 ? –

+0

然後只需添加'where'子句來查看當年的記錄。 –

0

這應該工作:

select 
    student, sum(value) 
from 
    payments 
group by 
    student 
having sum 
    (case when Payment_type is not null then 1 else 0 end) = 0 
2

SQL Fiddle

的MySQL 5.6架構設置

CREATE TABLE Payments 
    (`Student` int, `Payment` int, `Value` int, `Payment_type` varchar(4)) 
; 

INSERT INTO Payments 
    (`Student`, `Payment`, `Value`, `Payment_type`) 
VALUES 
    (1, 1, 100, NULL), 
    (1, 2, 200, NULL), 
    (2, 1, 200, NULL), 
    (3, 1, 150, 'Cash'), 
    (2, 2, 100, 'Cash'), 
    (3, 2, 200, NULL), 
    (1, 3, 200, NULL) 
; 

查詢1

select student, sum(value) 
from payments 
group by student 
having max(Payment_type) IS NULL 

Results

| Student | sum(value) | 
|---------|------------| 
|  1 |  500 | 
0

對於我來說,這是非常乾淨的,再加上語義準確關於你的描述:

SELECT student, SUM(value) 
    FROM payments p1 
    WHERE NOT EXISTS (SELECT 1 
         FROM payments p2 
         WHERE p2.student = p1.student 
         AND Payment_type IS NOT NULL) 
GROUP BY student 
相關問題