0

データを行に分割し、分割されたデータが再び表示されるかどうかを確認する構文を使用して、その分割された情報の数を取得する必要があります。

以下の入力表が表示された場合。C1にはABC、ACD、BCEなどのデータがあります。それを分割して、特定のデータごとにカウントし、合計カウントも取得したいと思います。

MYSQL でヘルプを歓迎します

SQLサーバーで試したクエリ:MYSQLへの新しいバイブとして、データ全体を取得できましたが、分割できませんでした。たとえば、私は知っていselect C1 from inputtableます。しかし、指定された列にある行のデータを分割するというアイデアが得られません。

図による説明:

Input Table:

C1        
----------
ABC 
ACD
BCE
NULL
A

Output Table:

Column1            Count            TotalCount
------------------------------------------------------
A                  3                  4
B                  2                  4
C                  3                  4
D                  1                  4
E                  1                  4
4

2 に答える 2

1

固定セット ABCDEFGHIJ を使用している場合は、次のようなものが実行できる可能性があります。

SELECT a.l         AS `Column1`
     , SUM(1)      AS `Count`
     , c.cnt       AS `TotalCount`
  FROM (
         SELECT CONVERT('A' USING latin1) AS l UNION ALL SELECT 'B'  
          UNION ALL SELECT 'C' UNION ALL SELECT 'D'
          UNION ALL SELECT 'E' UNION ALL SELECT 'F'
          UNION ALL SELECT 'G' UNION ALL SELECT 'H'
          UNION ALL SELECT 'I' UNION ALL SELECT 'J'
       ) a
  JOIN input_table t
    ON INSTR(t.c1,a.l)
 CROSS
  JOIN (SELECT COUNT(1) AS cnt FROM input_table) c
 GROUP BY a.l
 ORDER BY a.l

注: CONVERT は、クライアントの文字セットが列 c1 の文字セットと一致しない場合にのみ必要です... エラー 1267 照合の不正な組み合わせを回避するためにあります。

カウントが 0 の行を省略したい場合 (選択した回答のように)、追加することができます

HAVING SUM(1) > 1  

述語。

于 2013-01-21T20:46:05.060 に答える
0

データを任意の数の列に分割するには、ストアドプロシージャまたは同様の醜さが必要になります。10列に分割することは可能ですが、これらの列を行に変換して集約できるようにすると、やはり醜いコードが必要になります。これはすべて、スキーマがおそらく最初の正規形に違反していることを示しています。つまり、単一のテーブル「セル」に複数の値を格納しているということです。スキーマを変更できますか、それともそれを使用する必要がありますか?

あなたがそれを使わなければならないなら、ここにあなたが始めさせるためのいくつかの醜いコードがあります。SQLFiddleでテストされているように、サンプル入力で要求された出力を生成します。

SELECT q1.chr, COUNT(*), q2.cnt
FROM ( SELECT SUBSTR(C1, 1, 1) AS chr FROM tab
       UNION ALL
       SELECT SUBSTR(C1, 2, 1) AS chr FROM tab
       UNION ALL
       SELECT SUBSTR(C1, 3, 1) AS chr FROM tab
     ) AS q1,
     ( SELECT COUNT(C1) AS cnt FROM tab ) AS q2
WHERE q1.chr != ''
GROUP BY q1.chr

私は絶対にあなたにこのように物事を書くことを勧めないことに注意してください。代わりに、適切なデータベーススキーマを使用してください。この場合、行を一定の回数繰り返す必要はありません。また、結果のすべての行に対してそれを繰り返すことはかなり無意味に見えるため、合計をフェッチするために別のクエリを使用することも検討してください。

于 2013-01-21T20:29:49.290 に答える