SQL-使用附加条件筛选查询结果

SQL-使用附加条件筛选查询结果,sql,ms-access-2010,conditional-statements,Sql,Ms Access 2010,Conditional Statements,我有一个包含两个表的数据库: -记录我必须收到的所有付款的信用证 -付款记录我收到的付款 结构是 信用:身份证,总计 付款:id,已收到 我的目标是有一个查询,打印所有尚未完全支付的付款。现在,我编写了一个查询,它成功地打印了 -信用证号码 -总金额请求 -收到的款项总额 我只需要添加一个条件:不要打印付款已全部完成的记录。这是我的SQL代码: SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)

我有一个包含两个表的数据库: -记录我必须收到的所有付款的信用证 -付款记录我收到的付款

结构是 信用:身份证,总计 付款:id,已收到

我的目标是有一个查询,打印所有尚未完全支付的付款。现在,我编写了一个查询,它成功地打印了 -信用证号码 -总金额请求 -收到的款项总额 我只需要添加一个条件:不要打印付款已全部完成的记录。这是我的SQL代码:

SELECT Credit.id,
       Credit.total,
       (SELECT SUM(Payment.received)
       FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
FROM Credit
WHERE Credit.total > 0;
我试着用“WHERE Credit.total>TotalReceived”来更改最后一行,但不起作用

你能帮我吗?:)


注:在信用证中,id是唯一的,而在付款表中,可以显示许多具有相同id的行。

除非使用子查询,否则不能为聚合列添加
WHERE
子句。您必须使用
分组依据
拥有

您的查询可以这样重写(我更喜欢使用联接的这种结构,而不是像您使用的那样使用关联查询)

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
现在,添加一个
HAVING
子句

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
HAVING SUM(Payment.received) > 0
如果您绝对希望保留您的结构,请使用如下子查询

Select Id, Total, TotalReceived
From
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
    FROM Credit
    WHERE Credit.total > 0
) DerivedTable
Where TotalReceived > 0

除非使用子查询,否则不能为聚合列添加
WHERE
子句。必须使用
GROUP BY
HAVING

您的查询可以这样重写(我更喜欢使用联接的这种结构,而不是像您使用的那样使用关联查询)

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
现在,添加一个
HAVING
子句

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
HAVING SUM(Payment.received) > 0
如果您绝对希望保留您的结构,请使用如下子查询

Select Id, Total, TotalReceived
From
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
    FROM Credit
    WHERE Credit.total > 0
) DerivedTable
Where TotalReceived > 0

除非使用子查询,否则不能为聚合列添加
WHERE
子句。必须使用
GROUP BY
HAVING

您的查询可以这样重写(我更喜欢使用联接的这种结构,而不是像您使用的那样使用关联查询)

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
现在,添加一个
HAVING
子句

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
HAVING SUM(Payment.received) > 0
如果您绝对希望保留您的结构,请使用如下子查询

Select Id, Total, TotalReceived
From
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
    FROM Credit
    WHERE Credit.total > 0
) DerivedTable
Where TotalReceived > 0

除非使用子查询,否则不能为聚合列添加
WHERE
子句。必须使用
GROUP BY
HAVING

您的查询可以这样重写(我更喜欢使用联接的这种结构,而不是像您使用的那样使用关联查询)

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
现在,添加一个
HAVING
子句

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
HAVING SUM(Payment.received) > 0
如果您绝对希望保留您的结构,请使用如下子查询

Select Id, Total, TotalReceived
From
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
    FROM Credit
    WHERE Credit.total > 0
) DerivedTable
Where TotalReceived > 0

这将为您获取尚未付款的信用记录。您的付款表可能应该有一个
creditId
字段来加入,而不是在
credit.id=payment.id
上,但如果它是这样设置的,那么这应该会起作用

SELECT  c.id,
        c.total,
        SUM(Nz(p.received,0)) AS totalreceived
FROM    Credit c
        LEFT JOIN Payment p ON c.id = p.id --not sure about this?
WHERE   c.total > 0
GROUP BY c.id, c.total
HAVING  c.total > SUM(Nz(p.received,0))

这将为您获取尚未付款的信用记录。您的付款表可能应该有一个
creditId
字段来加入,而不是在
credit.id=payment.id
上,但如果它是这样设置的,那么这应该会起作用

SELECT  c.id,
        c.total,
        SUM(Nz(p.received,0)) AS totalreceived
FROM    Credit c
        LEFT JOIN Payment p ON c.id = p.id --not sure about this?
WHERE   c.total > 0
GROUP BY c.id, c.total
HAVING  c.total > SUM(Nz(p.received,0))

这将为您获取尚未付款的信用记录。您的付款表可能应该有一个
creditId
字段来加入,而不是在
credit.id=payment.id
上,但如果它是这样设置的,那么这应该会起作用

SELECT  c.id,
        c.total,
        SUM(Nz(p.received,0)) AS totalreceived
FROM    Credit c
        LEFT JOIN Payment p ON c.id = p.id --not sure about this?
WHERE   c.total > 0
GROUP BY c.id, c.total
HAVING  c.total > SUM(Nz(p.received,0))

这将为您获取尚未付款的信用记录。您的付款表可能应该有一个
creditId
字段来加入,而不是在
credit.id=payment.id
上,但如果它是这样设置的,那么这应该会起作用

SELECT  c.id,
        c.total,
        SUM(Nz(p.received,0)) AS totalreceived
FROM    Credit c
        LEFT JOIN Payment p ON c.id = p.id --not sure about this?
WHERE   c.total > 0
GROUP BY c.id, c.total
HAVING  c.total > SUM(Nz(p.received,0))


使用联接并尝试避免共同相关的内部查询。使用联接并尝试避免共同相关的内部查询。使用联接并尝试避免共同相关的内部查询。使用联接并尝试避免共同相关的内部查询。我尝试了使用内部联接编写的代码,但ACCESS给了我以下错误:“您不能执行不包含作为聚合函数一部分指定的术语“id”的查询。我对您的代码也有相同的要求…但是我认为您的代码没有完全满足我的需要:)我尝试了使用内部联接编写的代码,但ACCESS给了我以下错误:”您无法执行不包含作为聚合函数一部分指定的术语“id”的查询。“我对您的代码也有相同的要求……但是我认为您的代码没有完全满足我的需要:)我尝试了使用内部联接编写的代码,但ACCESS给了我以下错误:”您无法执行不包含作为聚合函数一部分指定的术语“id”的查询。“我对您的代码也有相同的要求……但是我认为您的代码没有完全满足我的需要:)我尝试了使用内部联接编写的代码,但ACCESS给了我以下错误:”您不能执行不包含作为聚合函数一部分指定的术语“id”的查询。“我对您的代码也有相同的要求……但是我认为您的代码没有完全满足我的需要:)几乎:我在左连接中编辑了你的连接,但是我看不到没有任何付款记录的信用卡行。左连接有用吗?@pittuzzo..使用空值时,你需要将空值合并为0,以使求和生效..尝试UpdateEyes!我需要使用左连接,但关键是最后一个代码行的c.total>sum(Bonifici.importo)正确删除付款完全覆盖信用证的记录,但也会删除尚未付款的信用证……如果我使用“HAVING c.total>SUM(ISNULL(p.received,0))"这不是编译:参数错误…您正在使用access?几乎:我在左连接中编辑了您的连接,但是我看不到没有任何付款记录的信用卡行。左连接有用吗?@pittuzzo..使用null时,您需要将null合并为0,以使总和起作用..尝试UpdateEyes!我必须使用左连接来满足我的需要关键是最后一个代码的行有c