2011-01-06 2 views
0

私は、ChannelIdというフィールドを含むテーブルを持っています。私は値に応じて2つのフィールドに分割したいと思います。私はこれを試してみました:SQL文での計算

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

目標は、私がChannelIdフィールドがapproriate価値があるかどうかを表す2つのブール値の列を持っているということで。構文エラーが発生します。

SQL構文を見る私は式を使用して新しい列名としてエイリアスを使用することはできませんが、SQL Serverはそれを突きつけました。私は何か本当にばかなことをしていますか?どうすればこの効果を達成できますか?

+0

質問が分かりません。列に2つの値しかない場合は、値を列として返すのはなぜですか?あなたは列にいくつかの集計を実行したいですか?それぞれの価値が何回存在するかのようにカウントするのですか? – spinon

+0

いいえ、別のプロセスへの入力用にデータを再フォーマットします。 –

+0

私は2つの緩やかなクエリ(またはサブクエリ)を作成する必要があると思います。 SQLのトリックは、 'SELECT'部分ではなく、' WHERE'部分で物事を尋ねることです。 – Marnix

答えて

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スタイルの文を使用して、これを行う方法を述べているが、私はちょうどこれは、データベース内のビジネスロジックを持つになるという意見を提供したいと思います。通常、私はデータベースを純粋にストレージ用に保ち、アプリケーションロジックの上位層にビジネスロジックを持たせることを目指しています。

アプリケーションが階層化されたアーキテクチャを持つと考えると、ビジネスロジックは1つのレイヤーになり、1つ以上のレイヤーはデータベースになります。 1つ以上のレイヤーがあなたのUIになります。 "データベース内のビジネスロジック"は、フォーム上のbutton_Clickイベントのハンドラーにビジネスロジックを入れるのと同じように悪いです。

これは、2011年のこの日のあなたの特定の状況には適していないことを感謝しますが、この質問の今後の読者のために、私はそれがうまくいくことを願っています。

+0

「データベース内のビジネスロジック」 –

+0

アプリケーションに階層化されたアーキテクチャがあると考えると、ビジネスロジックは1つのレイヤーになり、1つ以上のレイヤーはデータベースになります。 1つ以上のレイヤーがあなたのUIになります。同じ方法で、フォーム上の 'button_Click'イベントのためにビジネスロジックをハンドラに入れるのは悪いことです。 –

+0

あなたが最下層に置くことができるものは純粋な利益です。私は3層アーキテクチャーでは一度も働いていませんでしたが、2層(クライアント/サーバー)ではバックエンドにできる限り多くのビジネスロジックを置いていました。これは、より安全で高速なアプリを意味します。 –