2

選択範囲で2つのグループ間で最も頻繁な値を表示する必要があり、メッセージに沿って表示する必要があるので、我慢してください。私はOracleXEを使用していますが、これは私がこれまでに得たものです。

SELECT (
    CASE type
        WHEN 0 THEN 'heroes'
        WHEN 1 THEN 'villains'
        ELSE 'neither'
    END
) AS MostFrequent
FROM (
    SELECT type
    FROM mutants
    GROUP BY type
    ORDER BY count(*) DESC
) WHERE rownum <= 1

これまでのところ、タイプ1よりもタイプ0のミュータントが多い場合はヒーローが表示され、タイプ0よりもタイプ1のミュータントが多い場合は悪役が表示されますが、同点の場合はデータが表示されません。私のために働く:(私は「どちらでもない」と言う必要があるので、どんな助けでも広く感謝されるでしょう。

4

2 に答える 2

3
WITH
RECOUNTS AS
(    
  SELECT
    NVL(COUNT(CASE TYPE WHEN 0 THEN TYPE END), 0) AS HEROES,
    NVL(COUNT(CASE TYPE WHEN 1 THEN TYPE END), 0) AS VILLAINS
  FROM MUTANTS
)
SELECT
  CASE WHEN HEROES > VILLAINS THEN 'heroes'
       WHEN HEROES < VILLAINS THEN 'villains'
       ELSE 'neither'
  END AS MOSTFREQUENT
FROM RECOUNTS
于 2012-09-23T07:41:36.617 に答える
1

このSQLフィドルを見てください

select 
   case when heroes > villains then 'heroes'
        when heroes < villains then 'villains'
        else 'neither'
   end as MostFrequent  
from ( select 
        (select count(*) from mutants where type = 0) as heroes,
        (select count(*) from mutants where type = 1) as villains
      from dual)
;

肝心なのは、両方の結果がなければ、「どちらでもない」と決めることはできないということです。これを実現するには、最初にカウントを行うサブクエリを使用します。カウントはさまざまな方法で行うことができますが、上記はおそらく少し効率が悪く、GuiGi からの提案も機能します。このSQL Fiddleを参照してください

于 2012-09-23T08:29:32.817 に答える