SQL命令-用于多列

SQL命令-用于多列,sql,pivot,Sql,Pivot,我有一个包含列的表-InvDate、CustName、InvAmt、PayType和PaidAmt。客户可以通过现金、支票或信用卡支付金额(PayType)。 现在根据这张表,我想要这样的东西: SELECT InvDate, CustName, InvAmt, (PaidAmt as CashPay Where PayType = 'Cash'), (PaidAmt as CheqPay WHERE PayType = 'Cheque'), (P

我有一个包含列的表-
InvDate
CustName
InvAmt
PayType
PaidAmt
。客户可以通过现金、支票或信用卡支付金额(
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

您没有指定正在使用的RDBMS,但您应该能够在任何数据库中使用带有
大小写
表达式的聚合函数来透视数据:

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

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

您没有指定您正在使用的RDBMS,但是您应该能够在任何数据库中使用带有
大小写
表达式的聚合函数来透视数据:

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

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

如果您使用的是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

如果您使用的是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


请说明哪种形式的SQL、ANSI或特定的RDBMs。您使用的是哪种数据库系统?答案取决于您是否使用Oracle、MySQL、SQL Server等。请指出哪种形式的SQL、ANSI或特定的RDBMs。您使用的是哪种数据库系统?答案取决于你是否使用Oracle、MySQL、SQL Server等。实际上我不同意你的看法。如果客户每天有多张发票,他们很可能希望得到每种付款类型的总金额,因此需要进行汇总。@AndersUP如果您能够多次加入表中,我现在就没有时间进行测试。作为一个简单的后续说明,第一个机会是,如果您不进行汇总,会计数据库可能设计得很糟糕(我想我有资格这么说),其次,如果是这样,删除总和和分组就足以透视信息。@ChrisTravers是的,原始透视解决方案(有或没有聚合)是有效的,并且在问题范围内,这就是为什么我的答案中没有包含一个支点。但是-现在已删除-多重联接的构造不正确,无法返回正确答案。蓝脚:我不反对你可以多次加入同一张桌子,但这是一个很难的构造,因为你不能保证你会有一个锚行,所以实际上你正在寻找一个交叉连接-然后你可能会更好地使用其中一个已经建议的解决方案。@AndersUP我删除了多重连接,因为这是可能的,我没有时间测试答案,我同意没有足够的细节来正确地加入行。事实上,我不同意你的观点。如果客户每天有多张发票,他们很可能希望得到每种付款类型的总金额,因此需要进行汇总。@AndersUP如果您能够多次加入表中,我现在就没有时间进行测试。作为一个简单的后续说明,第一个机会是,如果您不进行汇总,会计数据库可能设计得很糟糕(我想我有资格这么说),其次,如果是这样,删除总和和分组就足以透视信息。@ChrisTravers是的,原始透视解决方案(有或没有聚合)是有效的,并且在问题范围内,这就是为什么我的答案中没有包含一个支点。但是-现在已删除-多重联接的构造不正确,无法返回正确答案。蓝脚:我不反对你可以多次加入同一张桌子,但这是一个很难的构造,因为你不能保证你会有一个锚行,所以实际上你正在寻找一个交叉连接-然后你可能会更好地使用其中一个已经建议的解决方案。@AndersUP我删除了多重连接,因为这是可能的,我没有时间测试答案,我同意没有足够的细节来正确地连接行。我认为您最初在答案上有一个聚合函数,因此我发表了评论。当我看到你没有评论时,我删除了我的评论。但仅仅因为我对你的答案发表了评论,并不意味着我会投反对票。我只是想澄清一下,我没有投你的反对票。我对你的帖子发表了评论,当我意识到我的评论不正确时,我删除了我的评论。我不同意你说我的回答会给出错误的结果。所有3个版本(你的/我的)都提供了相同的结果——我的否决票已被删除,因为它是针对连接的,而不是其他两个解决方案。我同意目前的三个版本提供了有效的结果。我认为你最初对你的答案有一个聚合函数,因此我的评论。当我看到你没有评论时,我删除了我的评论。但仅仅因为我对你的答案发表了评论,并不意味着我会投反对票。我只是想澄清一下,我没有投你的反对票。我对你的帖子发表了评论,当我意识到我的评论不正确时,我删除了我的评论。我不同意你说我的回答会给出错误的结果。所有3个版本(你的/我的)都提供了相同的结果——我的否决票已被删除,因为它是针对连接的,而不是其他两个解决方案。我同意目前的三个版本提供了有效的结果。