2015-08-26 47 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 
相关问题