【问题标题】:Display result on specified column based on computed result根据计算结果在指定列上显示结果
【发布时间】:2013-02-25 12:42:54
【问题描述】:

我有 2 个数据库表:客户信息和余额

客户:客户 ID、姓名

交易:Customer_ID、Transaction_Name、Transaction_Amount...(其他列,但我的问题不是必需的)

预期查询输出示例:

Customer_ID | Debit_Balance | Credit_Balance
1           |         500.00|
2           |               | 300.00

解释:客户 1 有 500.00 余额,客户 2 有 300.00 额外支付的金额(这通常是 (-) 负数)

问题:

如何仅在单个查询中执行此操作?我只是想生成报告(如上面的示例输出) 以显示结果金额 if positive 为那些negative 余额的 Debit_Balance 和 Credit_Balance 然后将处理结果使用 PHP。

更新: 我曾经对交易金额进行过这种处理:我根据他们的Transaction_Name总结所有Transaction_Amount

Balance = (All Transaction_Name 'SALES') Less (-) (All Transaction_Name 'SALES') Transaction_Name 'PAYMENT')

但这将迫使我创建虚拟表作为我的报告的存储库表和更多的 php 条件来比较和插入。

【问题讨论】:

  • 你自己有没有尝试过?
  • @juergend 我尝试将 Sum(Transaction_Amount) 作为 Debit_Balance,将 Sum(Transaction_Amount) 作为 Credit_Balance,但结果是 2 列有值。如果存在的话,我认为这是条件查询。

标签: php mysql ms-access


【解决方案1】:

我会使用类似下面的东西:

SELECT C.customer_id, C.Name, 
IF(SUM(Transaction_Amount)>0, SUM(Transaction_Amount),'') as Debit_Balance,  
IF(SUM(Transaction_Amount)<=0, SUM(Transaction_Amount),'') as Credit_Balance
From Customer As C 
LEFT JOIN Transaction  As T ON C.customer_id = T.customer_id
GROUP BY T.customer_id

【讨论】:

  • 谢谢,但我结束了为额外的 php 处理创建虚拟表。上述查询将导致重复输出。例如Debit_Balance 和 Credit_Balance 有两个值 w/c 我不打算看到。我只想要两个字段中的任何一个,而不是两者。 :) 谢谢
【解决方案2】:

您希望为每个客户提供单行输出,其中一列或另一列中的余额取决于它是正数还是负数。尝试(如果我们使用标准 SQL):

select
  subqry.Customer_ID
, case
    when subqry.Balance >= 0 then subqry.Balance
  end as Debit_Balance
, case
    when subqry.Balance < 0 then subqry.Balance * -1
  end as Credit_Balance
from (
  select
    Customer_ID
  , sum(
      case Transaction_Name
        when 'SALES' then Transaction_Amount
        when 'PAYMENT' then Transaction_Amount * -1
        else null
      end
    ) as Balance
  from Transaction
  group by Customer_ID
) as subqry

到目前为止,无需加入 Customer 表,因为我们没有在任何地方使用 Customer Name。

【讨论】:

    【解决方案3】:

    我想不出比这更容易的事情了:

    SELECT c.customer_id, pos.amount debit_balance, neg.amount credit_balance
    FROM customer c
    LEFT JOIN (SELECT SUM(t.transaction_amount) amount, t.customer_id
               FROM   transaction t
               WHERE  t.transaction_amount > 0
               GROUP BY t.customer_id) pos ON pos.customer_id = c.customer_id
    LEFT JOIN (SELECT SUM(t2.transaction_amount) amount, t2.customer_id
               FROM   transaction t2
               WHERE  t2.transaction_amount < 0
               GROUP BY t2.customer_id) neg ON neg.customer_id = c.customer_id
    

    第一个子查询汇总每个客户的所有正值,而第二个子查询汇总所有负值。然后获取所有客户并将两个对应的值合并为一个结果。

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多