2013-02-13 43 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