2014-11-04 70 views
1

我有具有transaction_id作爲主鍵的表,並且還包含customer_id這是一個外鍵。SQL:添加一列,分爲類別

現在有一列type它有兩個值:'Card''cash'

現在的一些客戶已經用於支付這兩種方法。我想添加一個新欄目並將客戶分類爲「Only card」,「Only cash」和「Both」。

Transaction id  Customer id Type 
1     100   Card 
2     101   Cash 
3     102   Card 
4     103   Cash 
5     101   Card 

所以在這個表我想要一個新列「支付類型」進行分類客戶101既是因爲他已經使用這兩種支付方式。

+1

該值不僅在您運行它的時間點有效嗎?如果他們以後用另一種方法支付,會怎樣在需要時通過查詢提取該值是否更好? – 2014-11-04 17:57:21

+0

是的,我同意價值僅在某個時間點有效。但我想直到現在分析付款方式。我正在尋找最好的方法。如果添加一個新列不是最好的方法,請建議我怎麼做,否則不需要添加列。 – pdpandya 2014-11-04 18:00:04

回答

0

而不是增加一列的表格,如果你想要做的是分析的付款方式,然後做這樣的事情可能會更好:

SELECT DISTINCT Table1.[Customer ID], T1.* 
FROM Table1 
CROSS APPLY (SELECT SUM(CASE WHEN [Type] = 'Cash' THEN 1 ELSE 0 END) AS Cash, 
      SUM(CASE WHEN [Type] = 'Card' THEN 1 ELSE 0 END) AS Card 
      FROM Table1 T WHERE T.[Customer ID] = Table1.[Customer ID]) T1 

爲您提供了這樣的結果:

CUSTOMER ID CASH CARD 
100   0  1 
101   1  1 
102   0  1 
103   1  0 
1

您可以使用窗口函數:

select t.*, 
     (case when min(type) over (partition by customerid) = max(type) over (partition by customerid) 
      then 'Only ' + min(type) over (partition by customerid) 
      else 'both' 
     end) 
from transactions t; 
+0

這工作。謝謝 ! – pdpandya 2014-11-04 18:06:59

+0

只是真棒:) – 2014-11-04 18:14:25

+1

@pdpandya你知道如何[接受](http://stackoverflow.com/help/accepted-answer)? – pnuts 2014-11-21 21:52:11

1

你可以做的更好,並刪除了一下redondancy(僅值現金和卡將只在表中重複,在這種情況下,我們更喜歡重複的ID )。所以,你可以創建例如payement_methods表格中,將有2列例如idmethod,你將與你剛纔提到的三個選項填充它(只收現金,卡而已,兩者都有),你必須在你的transaction table一個例如列payment_method_id(而不是您使用的類型列)。

例如

|id  | method  | 
|1  | Cash only | 
|2  | Card Only | 
|3  | Both   | 

事務表

|id  | other columns ...|payement method | 
|1  | other columns ...|1    | 
|2  | other columns ...|3    | 
//... 

對不起我的英語,好運氣。

0
Create table tran1(Transactionid int , Customerid int , Type varchar(100)) 

insert into tran1(Transactionid , Customerid , Type) values 
(1   ,   100 ,  'Card '), 
(2   ,   101 ,  'Cash'), 
(3   ,   102 ,  'Card '), 
(4   ,   103 ,  'Cash '), 
(5   ,   101 ,  'Card ') 

alter table tran1 add NewType varchar(100) 



Update tran1 set NewType ='Only card' where Customerid IN (
select d.custid from (
select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card 
,SUM(case when [Type]='Cash' then 1 else 0 end) cash 
from tran1 
group by Customerid)d 
where d.card=1 
) 


Update tran1 set NewType ='Only Cash' where Customerid IN (
select d.custid from (
select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card 
,SUM(case when [Type]='Cash' then 1 else 0 end) cash 
from tran1 
group by Customerid)d 
where d.cash=1 
) 

Update tran1 set NewType ='Both' where Customerid IN (
select d.custid from (
select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card 
,SUM(case when [Type]='Cash' then 1 else 0 end) cash 
from tran1 
group by Customerid)d 
where d.card=1 and cash=1 
) 
+0

謝謝你的幫助 – pdpandya 2014-11-12 18:33:07