SQL命令 - 用于多列

时间:2013-02-13 23:28:54

标签: sql pivot

我有一个包含列的表格 - InvDateCustNameInvAmtPayTypePaidAmt。客户可以通过现金,支票或信用卡(PayType)支付金额。 现在基于这个表,我想要这样的东西:

SELECT InvDate, CustName, InvAmt, 
       (PaidAmt as CashPay Where PayType = 'Cash'), 
       (PaidAmt as CheqPay WHERE PayType = 'Cheque'), 
       (PaidAmt As CCPay WHERE PayType = "CC') FROM Invoice

2 个答案:

答案 0 :(得分:3)

您没有指定您正在使用的RDBMS,但您应该能够使用任何数据库中具有CASE表达式的聚合函数转动数据:

select invDate, custName, InvAmt,
  sum(case when PayType = 'Cash' then PaidAmt else 0 end) CashPay,
  sum(case when PayType = 'Cheque' then PaidAmt else 0 end) CheqPay,
  sum(case when PayType = 'CC' then PaidAmt else 0 end) CCPay
from Invoice
group by invDate, custName, InvAmt

如果您使用的是具有PIVOT功能的数据库(SQL Server 2005 + / Oracle 11g +),那么您可以使用:

select *
from
(
  select invDate, custName, InvAmt,
    PayType, PaidAmt
  from Invoice
) src
pivot
(
  sum(paidamt)
  for paytype in (Cash, Cheque, CC)
) piv

还有一些方法可以通过多次连接表来完成,但是您需要提供有关表结构的其他详细信息才能正确构建该查询。

答案 1 :(得分:0)

如果您使用的是SQL Server,可以编写如下内容:

SELECT InvDate, CustName, InvAmt, 
       CASE WHEN PayType = 'Cash' THEN PaidAmt ELSE 0 END CashPay,
       CASE WHEN PayType = 'Cheque' THEN PaidAmt ELSE 0 END CheqPay,
       CASE WHEN PayType = 'CC' THEN PaidAmt ELSE 0 END CCPay
FROM Invoice