2013-02-13 41 views
0

我有一个列表 - InvDate,CustName,InvAmt,PayTypePaidAmt。客户可以通过现金,支票或信用卡(PayType)支付金额。 现在根据这个表,我想是这样的:SQL命令 - 对于多列

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

请注明SQL,ANSI或特定的RDBMS的表单。 – Andrew 2013-02-13 23:31:23

+0

您使用的是什么DB系统?答案取决于你是否使用Oracle,MySQL,SQL Server等...... – 2013-02-13 23:31:44

回答

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 

也可以通过多次连接您的表来完成此操作,但您需要提供有关表结构的其他详细信息以正确构建该查询。

+0

其实我不同意你。如果客户每天有多张发票,他们很可能需要每种付款类型的总额,因此需要进行汇总。 – Taryn 2013-02-14 00:57:32

+0

@AndersUP你可以多次参加表格,我现在只是没有时间来表达。 – Taryn 2013-02-14 01:01:25

+1

作为一个简单的后续记录,第一个机会是,如果你没有做聚合,会计数据库可能设计得很差(我认为我有资格这么说),其次,如果是这样的话,删除总和和按部分分组将足以枢转信息。 – 2013-02-14 01:50:11

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 
+0

我以为你最初在你的答案上有一个聚合函数,因此我的评论。我看到你没有看到我的评论。但仅仅因为我评论你的答案并不能保证我的决定。 – Taryn 2013-02-14 01:02:28

+0

只是为了澄清,我没有下调你的答案。我意识到我的评论不正确后,我评论了您的帖子,我删除了我的评论。我不同意你的看法,你说我的答案会提供不正确的结果。所有3个版本(你的/我的)提供了相同的结果 - http://sqlfiddle.com/#!3/3556d/5 – Taryn 2013-02-14 11:16:00

+0

我的downvote已被删除,因为它旨在加入,而不是其他两个解决方案。我同意目前的三个版本提供有效的结果。 – 2013-02-14 12:09:46