2016-04-14 12 views
0

この質問は非常によく似ています:https://stackoverflow.com/posts/1503959/edit しかし、私はそれをさらに進めて、各年齢の新しい列を作成したいと思います。SQLでユニークな列と行を含むオカレンスを数えるにはどうすればよいですか?

私は人々のテーブルを持っている:

name | age 
-------- 
bill | 25 
tom | 25 
tom | 23 
tom | 23 

私は同じ年齢であるどのように多くの名前をカウントするすべての名前を照会する場合、および追加の列:

name | 23 | 25 
---------------- 
bill | 0 | 1 
tom | 2 | 1 

ほとんど何これを行う効率的な方法? 私はサブクエリが遅くなることを恐れ、よりよい方法があるかどうか疑問に思っています。ある?

+0

非常に便利であるあなたは、列、行ないとして年齢をしたいのはなぜ? – Quassnoi

+0

名前の異なる人が何人いるのかのレポートが必要な場合は、テーブルを3次元にすることでテーブルを大幅に小さくします。 – Whitecat

+0

実際、テーブルはかなり短くなります。年齢の違う人がいるところには多くの価値があるならば、実際にはサイズはもっと大きくなるかもしれません。 – Whitecat

答えて

1

、動的なピボットは

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when age = ''', 
     age, 
     ''' then 1 else 0 end) AS ','`', 
     age,'`' 
    ) ORDER BY age 
) INTO @sql 
FROM 
    t; 

SET @sql = CONCAT('SELECT name, ', @sql, ' 
        FROM t 
        GROUP BY name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

FIDDLE

+0

年齢が表示されたときにこれがちょうど1または0を表示すると思う..私は人の年齢が重複した行が存在する可能性がある回数を反映するようにしたいと思います。 – Whitecat

+0

@Whitecat http://sqlfiddle.com/#!2/dd2c08/1の和でmaxを置き換えてください – Mihai

0

SQLでこれを行う方法は、最も簡単な方法はGROUP BYです。

SELECT name, age, COUNT(*) AS occurence FROM table GROUP BY name, age

しかし、あなたは別の形式でデータを取得します。 SQLはあなたが望むように動作しないので、PHPでそれらを再フォーマットする必要があります。あなたは多くの年齢値を持っている場合は

+0

私はこれが可能であることを知っています。 SQLで私はそれを行うことができます、クエリはちょうど大きくて醜い得るでしょう – Whitecat

+0

それは大規模で醜いクエリについてではありません。それは速度についてです。 MySQLはサブクエリやgroup_concatではうまくいかず、効率的な方法を望んでいました。だから私は、最も効率的な方法は、単純なGROUP BYクエリを使ってPHPで書式を変更することです。 –

+0

私はdownvoteをしませんでしたが、私はSQLを使いたいと思っていました。 – Whitecat

関連する問題