Mysql 如何在单个查询中使用IF()语句获取单独的字段数据

Mysql 如何在单个查询中使用IF()语句获取单独的字段数据,mysql,sql,Mysql,Sql,我试图在单个查询中分别获取未付金额和部分金额 select if(i.status = 'unpaid', sum(i.total_amount), '') unpaid, if(i.status = 'partial', sum(i.paid_amount), '') partial from {CI}invoices i where i.customer_id = ? and date(i.invoice_date) < '2014-01-0

我试图在单个查询中分别获取未付金额和部分金额

select 
    if(i.status = 'unpaid', sum(i.total_amount), '') unpaid, 
    if(i.status = 'partial', sum(i.paid_amount), '') partial 
from {CI}invoices i 
where 
    i.customer_id = ? and 
    date(i.invoice_date) < '2014-01-01' and 
    i.status not like 'paid%'
这是错误的,因为我不能在
IF()
条件中使用
as
。有谁能帮我解决这个问题或建议其他方法吗?

试试看:

select 
    sum(case when i.status = 'unpaid' then i.total_amount else 0 end) as unpaid, 
    sum(case when i.status = 'partial' then i.paid_amount else 0 end) as partial 
from {CI}invoices i 
where 
    i.customer_id = ? and 
    date(i.invoice_date) < '2014-01-01' and 
    i.status not like 'paid%'
选择
未付金额(如果i.status=‘未付’,则i.total_amount,否则为0结束),
总和(当i.status=‘部分’时,则i.paid_amount,否则0结束)作为部分
来自{CI}i
哪里
i、 客户标识=?及
日期(即发票日期)<'2014-01-01'和
i、 状态与“付费%”不同
尝试以下操作:

SELECT
    SUM( IF(i.status = 'unpaid', i.total_amount, 0) ) unpaid, 
    SUM( IF(i.status = 'partial', i.paid_amount, 0) ) partial 
FROM {CI}invoices i 
WHERE
    i.customer_id = ? AND
    date(i.invoice_date) < '2014-01-01' AND
    i.status IN ('unpaid', 'partial')
选择
未付金额(如果(i.状态=‘未付’,i.总金额,0),
总额(如果(i.状态=‘部分’,i.已付金额,0))部分
来自{CI}i
哪里
i、 客户标识=?及
日期(即发票日期)<'2014-01-01'和
i、 状态为(“未付”、“部分”)

您必须将表交叉连接到表本身,才能在同一行中获得付款和未付款:

SELECT 
    sum(iu.total_amount) unpaid, 
    sum(ip.paid_amount) partial 
FROM {CI}invoices iu
   CROSS JOIN {CI}invoices ip
where 
    ip.customer_id = ? AND iu.customer_id = ? AND
    date(ip.invoice_date) < '2014-01-01' AND date(iu.invoice_date) < '2014-01-01' AND
    iu.status = 'unpaid' AND ip.status = 'partial'
选择
未付金额(iu.总金额),
部分金额(已支付的知识产权金额)
来自{CI}iu
交叉连接{CI}ip
哪里
ip.customer\u id=?和iu.customer_id=?及
日期(ip发票日期)<'2014-01-01'和日期(iu发票日期)<'2014-01-01'和
iu.status=‘未付’和ip.status=‘部分’

@hjpotter92您能详细说明一下您想说什么吗,我已经为
总金额设置了
十进制
数据类型
ahh,现在它可以工作了,但想问一件事,
SUM(如果(i.status='unpaid',i.total\u amount,0))
是指
如果(i.status='unpaid',SUM(i.total\u amount),SUM(0))
还是
IF(i.status='navely',sum(i.total_amount),0)
?@jogesh_pi您想在过滤数据之后进行求和,而不是在浏览数据时进行求和。感谢您的解释:)
SELECT 
    sum(iu.total_amount) unpaid, 
    sum(ip.paid_amount) partial 
FROM {CI}invoices iu
   CROSS JOIN {CI}invoices ip
where 
    ip.customer_id = ? AND iu.customer_id = ? AND
    date(ip.invoice_date) < '2014-01-01' AND date(iu.invoice_date) < '2014-01-01' AND
    iu.status = 'unpaid' AND ip.status = 'partial'