2017-02-06 8 views
0

ステータスとカウントを表示するようなシナリオがあります。SQL Serverのcase文でデフォルト値を設定する方法は?

SELECT 
    CASE 
     WHEN Status = 'I' THEN 'IN PROGRESS' 
     WHEN Status = 'O' THEN 'Others' 
     WHEN Status = 'C' THEN 'COMPLETED' 
    END AS ' Status', 
    COUNT(Status) AS ' Counts' 
FROM 
    table1 

私だけCompletedInProgressの値を持っている:以下のモデル

Status   Counts 
--------------- -------- 
Completed   10 
In Progress   6 
Others    0 

を見て、私はこのコードを持っています。現在、私は2行だけを取得しています。しかし、私はOthersを含む3行を必要とし、それは0でなければなりません - どのようにSQLでそれを行うには?

+0

2行を取得しているということは、あなたが私たちに表示していない「GROUP BY」を持っているということですか? –

+3

集計があるので、そこにグループが存在する必要があります。クエリ全体を共有できますか? –

+0

はい私はGROUP BYステータスを使用しました – kselva

答えて

2

このように、「それ以外」を追加します。

SELECT CASE 
     WHEN Status= 'I' THEN 'IN PROGRESS' 
     WHEN Status= 'C' THEN 'COMPLETED' 
     ELSE 'Others' 
     END   AS ' Status' 
FROM table1 
+0

@TimSchmelterありがとうございました – ganders

+0

'Status = 'O''グループの*行*が必要であると思われる疑問が混乱しています。 –

+0

しかし進行中であり、完了しました。また、nullになる可能性があります。その場合、私は条件 – kselva

1

私の理解から、あなたは、私がこれまで簡素化するでしょうその中のステータス値とメインテーブルを持っている:

CREATE TABLE #MainTable 
(
    id INT, 
    [status] NVARCHAR(1) 
) 

あなた問題は、OthersのステータスがOの行がない場合、カウントを取得するために行をグループ化するときに0が取得されないことです。

にリンクするStatusテーブルを作成することをおすすめします。これにより、CASEステートメントの必要性もなくなります。

完全なソリューション:

CREATE TABLE #MainTable 
    (
     id INT , 
     [status] NVARCHAR(1) 
    ); 

INSERT INTO #MainTable 
     (id, [status]) 
VALUES (1, 'I'), 
     (2, 'I'), 
     (3, 'I'), 
     (4, 'I'), 
     (5, 'C'), 
     (6, 'C'); 

CREATE TABLE #status 
    (
     [status] NVARCHAR(1) , 
     [statusText] NVARCHAR(15) 
    ); 

INSERT INTO #status 
     (status, statusText) 
VALUES ('I', 'In Progress'), 
     ('C', 'Completed'), 
     ('O', 'Others'); 

SELECT s.statusText , 
     COUNT(t.[status]) StatusCount 
FROM #MainTable t 
     RIGHT JOIN #status s ON s.status = t.status 
GROUP BY s.statusText; 

DROP TABLE #MainTable; 
DROP TABLE #status; 

を生成します:それは私はあなたがID値で置き換えることを示唆しているI,O,C文字列値、に参加する上記の例では

statusText StatusCount 
Completed 2 
In Progress 4 
Others  0 

CREATE TABLE #MainTable 
    (
     id INT , 
     statusId INT 
    ); 

CREATE TABLE #status 
    (
     statusId INT , 
     statusShort NVARCHAR(1) , 
     statusText NVARCHAR(15) 
    ); 

SELECT t.id , 
     t.statusId , 
     s.statusId , 
     s.statusShort , 
     s.statusText 
FROM #MainTable t 
RIGHT JOIN #status s ON s.statusId = t.statusId 

DROP TABLE #MainTable; 
DROP TABLE #status; 
関連する問題