0

複数の行を結合し、等しい値の出現回数を返すSQLクエリを実現しようとしています。

ID    Row_1    Row_2    Row_3
1     Value    NULL     NULL
2     NULL     Value    Value
3     NULL     Value    NULL
4     NULL     Value2   NULL

クエリは2行を返す必要があります

ID    Row     Count
1*    Value   3
4     Value2  1

最初に返された行のIDは重要ではありません。値が3つの元の行すべてで一意である場合は、元のIDを返す必要があります(結果セットの行2に示されているように)。テーブルには50.000を超える行があることを言及する必要があります。それほど時間はかからないはずです。

テーブルをそれ自体で結合するなど、いくつかのアプローチを試しました。本当に問題を解決したものはありません。

前もって感謝します。

マルコ

4

2 に答える 2

2

最初に、すべての非 null 値のリストを組み立てるサブクエリを作成してから、それに JOIN できます。

値のリストのサブクエリ:

SELECT row_1 AS val FROM mytable WHERE row_1 IS NOT NULL
UNION
SELECT row_2 AS val FROM mytable WHERE row_2 IS NOT NULL
UNION
SELECT row_3 AS val FROM mytable WHERE row_3 IS NOT NULL

(UNION暗黙的に a を実行するDISTINCTため、結果のリストに重複する値はありません。)

次に、それを結合してカウントを取得できます。

SELECT m.id, v.val AS `row`, COUNT(*) AS `count`
FROM mytable m
INNER JOIN (
  SELECT row_1 AS val FROM mytable WHERE row_1 IS NOT NULL
  UNION
  SELECT row_2 AS val FROM mytable WHERE row_2 IS NOT NULL
  UNION
  SELECT row_3 AS val FROM mytable WHERE row_3 IS NOT NULL
) v
  ON v.val = m.row_1
    OR v.val = m.row_2
    OR v.val = m.row_3
GROUP BY v.val

SQL Fiddleの実際の例を次に示します。

于 2012-07-12T17:14:27.683 に答える
0

::のようにできます

Select 
ID, 
CONCAT(ifnull(ROW_1,''), ifnull(ROW_2,''), ifnull(ROW_3,'')) as `temp_ROW`,
count(1) as count

from table group by temp_ROW;
于 2012-07-12T15:40:26.537 に答える