5

SQL(MySQL) のデータ インポート スクリプトで問題に直面しています。行をタイプ別にグループ化して、各タイプの行数をカウントする必要があります。これまでのところ、それは実際には問題ではありません。できることがわかっているからです。

SELECT 
  data.type, 
  COUNT(data.type) 
FROM data 
GROUP BY data.type;

したがって、それを行うことで、次の結果が得られます。

-------------- -------------------
| | タイプ | COUNT(データ型) |
|--------------|---------------------|
| | 0 | 1 |
| | 1 | 46 |
| | 2 | 35 |
| | 3 | 423 |
| | 4 | 64 |
| | 5 | 36 |
| | 9 | 1 |
 -------------- -------------------

上記の結果のように、 type列の値は常に 0 から 9 の範囲になることがわかっています。したがって、テーブル コンテンツの既存の値だけでなく、欠落している型の値も一覧表示して、それらの COUNT 値を 0 に設定したいと思います。

上記のクエリ結果に基づくと、予想される結果は次のようになります。

-------------- -------------------
| | タイプ | COUNT(データ型) |
|--------------|---------------------|
| | 0 | 1 |
| | 1 | 46 |
| | 2 | 35 |
| | 3 | 423 |
| | 4 | 64 |
| | 5 | 36 |
| | 6 | 0 |
| | 7 | 0 |
| | 8 | 0 |
| | 9 | 1 |
 -------------- -------------------

テーブルの内容を GROUP/COUNT-1 する前に各タイプの 1 行をこっそり INSERT し、INSERT で他の列にフラグを立てて、後でこれらの行を削除できるようにすることができます。したがって、インポート スクリプトの手順は次のように変更されます。

  1. TRUNCATEテーブル; (テーブルに古いデータがあった場合、新しいコンテンツを安全にインポートできません)
  2. 「制御」行を挿入します
  3. LOAD DATA INFILE INTO TABLE ;
  4. GROUP/COUNT-1テーブルの内容。
  5. 「コントロール」行を削除します。(だから私はまだテーブルの内容を扱うことができます)
  6. 他の仕事をしてください。

しかし、期待される結果に到達するためのよりクリーンな方法を探していました。可能であれば、多数の JOIN を使用しない単一のクエリ。

提案やアドバイスをいただければ幸いです。どうもありがとうございました!

編集

すべてのタイプを格納して結合するテーブルの作成に関する回答に感謝します。それは本当に問題を解決します。私のアプローチもそれを解決しますが、あなたがしたように型を保存します。

したがって、受け取った回答と希望する範囲に基づいて、「別の」質問があります。明確にするだけです...新しいテーブルを作成したり、これらのタイプを挿入したりしないMySQLコマンドで期待される結果に到達することは可能ですか? ?

実際、タイプを保存する質問を解決する際に問題は見られません...単純化されたコマンドを見つけたいだけです...「ベストプラクティス」のようなもの...ある種のフィルター... as私は実行できます:

GROUP BY data.type(0,1,2,3,4,5,6,7,8,9)

これらのフィルタリングされた値を返すことができます。

そのようなコマンドが本当に存在する/可能である場合、私はそのようなコマンドを学ぶことに本当に興味があります.

そして改めまして、どうもありがとうございました!

4

4 に答える 4

0

typesすべての有効なタイプのテーブルがあると仮定しましょう。

SELECT t.type, 
       COUNT(data.type) 
FROM data join types t on data.type = t.type
GROUP BY t.type
order by t.type

明示的に含める必要があり、特定の順序で結果を生成するためにorder byに依存しないでください。group by

于 2013-01-14T17:28:24.017 に答える
0

最も簡単な方法は、すべてのtype値のテーブルを作成し、カウントを取得するときにそのテーブルに参加することです。

select t.type,
  count(d.type)
from types t
left join data d
  on t.type = d.type
group by t.type

デモ付きのSQLフィドルを参照してください

または、次を使用できます。

select t.type,
  count(d.type)
from
(
  select 0 type
  union all
  select 1 
  union all
  select 2
  union all
  select 3
  union all
  select 4
  union all
  select 5 
  union all
  select 6
  union all
  select 7
  union all
  select 8
  union all
  select 9 
) t
left join data d
  on t.type = d.type
group by t.type

SQL FiddlewithDemoを参照してください

于 2013-01-14T17:28:59.397 に答える
0

1つのオプションは、値が0〜9の静的な数値テーブルを作成することです。これが最も洗練されたアプローチであるかどうかはわかりません。SQLServerを使用している場合は、別のアプローチを考えることができます。

次のようなものを試してください。

SELECT 
  numbers.number, 
  COUNT(data.type) 
FROM numbers 
left join data 
  on numbers.number = data.type
GROUP BY numbers.number;

そしてSQLフィドル

于 2013-01-14T17:32:34.180 に答える
0

わかりました...見つけたと思います!皆さん、ありがとうございました!!!私は自分の答えを受け入れています。

@GordonLinoff のコメントに同意します。ベスト プラクティスは型の値を保存して説明することであり、簡潔でわかりやすいデータベースとクエリを維持できます。

しかし、私が知る限り、無関係な情報である可能性のあるデータがある場合は、それを保存する以外の方法で処理することをお勧めします。

だから、私はこのクエリを開発しました:

SELECT 
  SUM(IF(data.type = 0, 1, 0)) AS `0`, 
  SUM(IF(data.type = 1, 1, 0)) AS `1`, 
  SUM(IF(data.type = 2, 1, 0)) AS `2`, 
  SUM(IF(data.type = 3, 1, 0)) AS `3`, 
  SUM(IF(data.type = 4, 1, 0)) AS `4`, 
  SUM(IF(data.type = 5, 1, 0)) AS `5`, 
  SUM(IF(data.type = 6, 1, 0)) AS `6`, 
  SUM(IF(data.type = 7, 1, 0)) AS `7`, 
  SUM(IF(data.type = 8, 1, 0)) AS `8`, 
  SUM(IF(data.type = 9, 1, 0)) AS `9` 
FROM data;

それほど高速で最適化された美しいクエリではありませんが、私が管理するデータのサイズ (インポートごとに 100.000 行未満) に対しては、GROUP/COUNT ジョブを「手動で」実行し、一般的な開発マシンで 0.13 秒で実行します。

行と列が選択される方法だけで、予想される結果とは異なります.2列の10行ではなく、一致するタイプでラベル付けされた10列の1行があります。また、名前と説明を与える型の値を標準化したので(確実に変更するつもりはありません)、型名を列ラベルとして使用できるようになりました。結果の 3 番目の列を選択するための型情報を含むテーブル (これは、いくつかの標準に基づくインポート スクリプトであるため、実際にはそれほど重要ではありません)。

助けてくれてありがとう!

于 2015-12-22T17:15:30.910 に答える