1

私はかなり複雑なクエリを実行していて、最後のステップでスリップしています。

私はここまで到達することができました:

id  refid           system_id   item_description_id   system_component_id   current_status
711 4fb62cece5313   49          NULL                  711                   RUNNING
712 4fb62cece547d   49          NULL                  712                   STOPPED
713 4fb62cece5616   50          NULL                  713                   RUNNING
714 4fb62cece5803   50          NULL                  714                   STOPPED
716 4fb62cece5ab8   51          NULL                  716                   RUNNING

これらは、各システムのすべてのコンポーネントの現在のステータスです。次に来るのは、それらをシステムごとにグループ化し、「STOPPED」であるオカレンスをカウントすることです。

私の問題は、一部のシステムには「STOPPED」の行がないか、システムが更新されていない場合は行がまったくないことです。それでも、結果の一部としてそれらを取得する必要があります。システムごとにグループ化するだけで、これら2つのケースを除くすべてのケースで機能します。この場合、停止したコンポーネントがまったくない場合でも、結果の値は「1」になります。

次のようなものを返すクエリを作成するにはどうすればよいですか。

system_id    status_count
49           1
50           1
51           0

そしてそうではありません:

system_id    status_count
49           1
50           1
51           1

上記の表で?

4

2 に答える 2

3

次のように を使用する必要がありますSUM(boolean)

select system_id, 
  sum(current_status = 'STOPPED') AS stopped_count, 
  sum(current_status = 'RUNNING') as running_count
from tbl
group by system_id

ブール値は MySQL で自動的に整数に縮小されます

出力:

| SYSTEM_ID | STOPPED_COUNT | RUNNING_COUNT |
|-----------|---------------|---------------|
|        49 |             1 |             1 |
|        50 |             1 |             1 |
|        51 |             0 |             1 |

ライブ テスト: http://www.sqlfiddle.com/#!2/d3bcc/2

COUNT (またはその他の集計関数) が LEFT JOIN から取得された場合、結果を COALESCE または ISNULL で囲む必要があります。

select system_id, 
  isnull( sum(current_status = 'STOPPED') , 0 ) AS stopped_count, 
  isnull( sum(current_status = 'RUNNING') , 0 ) as running_count
from tbl
group by system_id

ANSI SQL 準拠:

select system_id, 
  coalesce( sum(current_status = 'STOPPED') , 0 ) AS stopped_count, 
  coalesce( sum(current_status = 'RUNNING') , 0 ) as running_count
from tbl
group by system_id

ただし、一部のデータベースは少し冗長です。Postgresql: http://www.sqlfiddle.com/#!1/d3bcc/2

select system_id, 
  sum((current_status = 'STOPPED')::int) AS stopped_count, 
  sum((current_status = 'RUNNING')::int) as running_count
from tbl
group by system_id

その他のデータベース: http://www.sqlfiddle.com/#!3/d3bcc/2

select system_id, 
  count(case when current_status = 'STOPPED' then 1 end) AS stopped_count, 
  count(case when current_status = 'RUNNING' then 1 end) as running_count
from tbl
group by system_id
于 2012-05-18T12:18:59.727 に答える
1
select system_id, 
IF( if(currentstaus = 'RUNNING',0.5,0) + if(currentstaus = 'STOPPED',0.5,0)=1,1,0) 
AS status_count from table_name group by system_id

このクエリを試して、機能するかどうかを教えてください。

于 2012-05-18T12:36:16.160 に答える