67

次の定義を持つ「 tbl_transaction 」というデータベース テーブルがあります。

id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT

と の 2 つの列を生成したいと思いIncome AmtますExpense Amt

支出項目か収入項目かに応じて、出力が正しい列に表示されるように、SQL クエリのみを使用して条件付きで列を設定することは可能ですか?

例えば:

ID        Heading         Income Amt       Expense Amt
1         ABC             1000             -
2         XYZ             -                2000

データベースとしてMySQLを使用しています。これを達成するために CASE ステートメントを使用しようとしています。

乾杯!

4

6 に答える 6

150

はい、次のようなものです。

SELECT
    id,
    action_heading,
    CASE
        WHEN action_type = 'Income' THEN action_amount
        ELSE NULL
    END AS income_amt,
    CASE
        WHEN action_type = 'Expense' THEN action_amount
        ELSE NULL
    END AS expense_amt

FROM tbl_transaction;

他の回答が指摘しているように、MySQL には、IF()冗長でない構文を使用してこれを行う機能もあります。これは通常、他の場所ではサポートされていない SQL に対する MySQL 固有の拡張であるため、通常はこれを回避しようとします。 CASE標準 SQL は標準 SQL であり、さまざまなデータベース エンジン間での移植性がはるかに優れています。移植可能な代替クエリがかなり遅い場合や不便な場合にのみ、エンジン固有の拡張機能を使用して、可能な限り移植可能なクエリを作成することを好みます。

于 2013-03-07T07:57:44.217 に答える
23

MySQLには次のものもありますIF():

SELECT 
  id, action_heading, 
      IF(action_type='Income',action_amount,0) income, 
      IF(action_type='Expense', action_amount, 0) expense
FROM tbl_transaction
于 2013-03-07T07:59:15.423 に答える
10

使ってみてIF(condition, value1, value2)

SELECT ID, HEADING, 
IF(action_type='Income',action_amount,0) as Income,
IF(action_type='Expense',action_amount,0) as Expense
于 2013-03-07T07:56:55.673 に答える
4

これはうまくいくはずです:

select 
  id
  ,action_heading
  ,case when action_type='Income' then action_amount else 0 end
  ,case when action_type='Expense' then expense_amount else 0 end
from tbl_transaction
于 2013-03-07T07:57:10.807 に答える
2

心に留めておくべきもう 1 つのことは、MySQL には 2 つの異なる CASE があることです。 -functions.html#operator_case ) と CASE と呼ばれるものですが、完全に異なる構文と完全に異なる機能を持っています

常に、一方が必要なときに、もう一方を最初に使用します。

于 2015-08-03T17:52:01.357 に答える