2011-01-06 117 views
0

我有一個包含一個名爲渠道ID字段的表。我想根據價值將其分成兩個字段。我試過這個:計算在SQL語句

SELECT CustomerId, ChannelId = 1 as Chan1, ChannelId = 2 as Chan2 FROM .... 

目標是我有兩個布爾列表示是否ChannelId字段是approriate值。我收到一個語法錯誤。

望着SQL語法我看不出有任何理由爲什麼我不能使用表達式,然後別名它作爲一個新的列名,但SQL Server上它嘶啞。我在做一些非常愚蠢的事情嗎?我怎樣才能達到這個效果?

+0

我不明白這個問題。如果列中只有兩個值,爲什麼不只是將值作爲列返回?你想要在列上執行一些聚合嗎?比如說數數每個值存在多少次? – spinon 2011-01-06 21:36:02

+0

不,重新格式化輸入到不同進程的數據。 – 2011-01-06 21:37:00

回答

1

你必須執行一個表達式,而不是一個賦值,這取決於他的SQL風格。由於您使用的SQL Server(T-SQL):

SELECT CustomerId, (CASE WHEN ChannelId = 1 THEN 1 ELSE 0 END) as Chan1, (CASE WHEN ChannelId = 2 THEN 1 ELSE 0 END) as Chan2 FROM .... 

有可能是一個更好的方式來做到這一點,但是這就是我要做的事。

1

嘗試:

select 
    CustomerId 
    , case when ChannelId = 1 then 1 else 0 end as Channel_1 
    , case when ChannelId = 2 then 1 else 0 end as Channel_2 
from Customer_Channel ; 
0

人們已經說了如何做到這一點,利用CASE ... WHEN ... THEN樣式聲明,但我只是想提供,這相當於在數據庫中有業務邏輯的觀點。通常我的目標是保持數據庫純粹用於存儲,並在我的應用程序的更高層中擁有​​業務邏輯。

我覺得這種方式,因爲如果你考慮一個應用程序有一個分層架構,你把你的業務邏輯在一層,一層或多層更深的將是你的數據庫。您的用戶界面可能會更高一層或更多層。 「數據庫中的業務邏輯」不好,就像在表單上將事件邏輯放入事件處理程序button_Click一樣糟糕。

我很欣賞這可能不是在2011年適合在這一天你的具體情況,但對這個問題的未來的讀者,我希望這是有些用處。