2

私は現在、このREPLACE関数を使用して、次のようにいくつかのレコード名(intを対応する人間が読める形式の名前に変換)を変更しています。

SELECT SUM(COUNT) AS Actions, replace(replace(replace(replace(replace(replace(EVENT, 2, 'iOS'), 1, 'Web'), 3, 'Android'), 4, 'Windows'), 5, 'Mac'), 6, 'Unknown') AS Platform 
FROM `METRICS_WEEKLY` 
WHERE EVENT IN (1, 2, 3, 4 ,5 ,6) 
GROUP BY EVENT

列に30を超える数値を使用するクエリを作成し、EVENTそれらをわかりやすい名前にマップしたいと思います。現在のテーブルを変更できません(私はテーブルスキーマの作成者ではありません)。フィールド名のより大きなグループをマップする簡単な方法はありますか?

4

4 に答える 4

1

あなたが説明しているのはENUMデータ型です。リストの1つとして列を作成するENUMと、すべての文字列の置換を回避できます。値は整数形式で保存され、使用可能な選択肢の1つである必要がありますが、同等の文字列として表示されます。

CREATE TABLE `METRICS_WEEKLY` (
  `COUNT` INT,
  `EVENT` ENUM (
    'Web',
    'iOs',
    'Android',
    'Windows'
    'Mac',
    'Unknown'
  )
);

または、リストが短い場合は、適切な正規化に従ってこれらの値を保持するテーブルを作成します。

于 2013-01-11T18:51:25.910 に答える
1

マッピングテーブルを使用する方が簡単です。

ReplaceValue
---------------
値番号
iOS 2
Web 1
Android 3
Windows 4

次にJOINvalueを使用しますnumber。置換する値を更新した場合に子テーブルにカスケードされるように、リレーションシップの作成を検討することをお勧めします。

于 2013-01-11T18:51:35.467 に答える
1

あなたは本当に、本当に、本当に、EventType参照テーブルが必要です。それまでの間、次のようなものがあります。

select EventName, COUNT(*) as Actions
from Metrics_Weekly mw left outer join
     (select 'iOS' as EventName, 2 as EventId union all
      select 'Web', 1 union all
      select 'Android', 3 union all
      select 'Window', 4 union all
      select 'Mac', 5 union all
      select 'Unknown', 6
     ) eventType
     on mw.Event = evenType.eventId
group by eventName
于 2013-01-11T18:52:18.193 に答える
0

これを試して:

SELECT SUM(COUNT) AS Actions, 
        (CASE event 
            WHEN 1 THEN 'Web' 
            WHEN 2 THEN 'iOS' 
            WHEN 3 THEN 'Android'
            WHEN 4 THEN 'Windows' 
            WHEN 5 THEN 'Mac' 
        ELSE 'Unknown' END )  AS Platform
FROM METRICS_WEEKLY
WHERE EVENT IN (1, 2, 3, 4 ,5 ,6) 
GROUP BY EVENT
于 2013-01-11T18:53:46.013 に答える