4

ピボット テーブル クエリに取り組んでいます。スキーマは次のとおりです。

スノー、名前、地区

同じ名前が多くの地区に表示される場合があります。例として、サンプル データを取り上げます。

1 Mike CA
2 Mike CA
3 Proctor JB
4 Luke MN
5 Luke MN
6 Mike CA
7 Mike LP
8 Proctor MN
9 Proctor JB
10 Proctor MN
11 Luke MN

ご覧のとおり、4 つの異なる地区 (CA、JB、MN、LP) があります。ここで、地区に対して名前をマッピングすることにより、生成されたピボット テーブルを取得したいと考えました。

Name CA JB MN LP
Mike 3 0 0 1
Proctor 0 2 2 0
Luke 0 0 3 0

私はこれのために次のクエリを書きました

select name,sum(if(District="CA",1,0)) as "CA",sum(if(District="JB",1,0)) as "JB",sum(if(District="MN",1,0)) as "MN",sum(if(District="LP",1,0)) as "LP" from district_details group by name

ただし、地区が増える可能性があります。その場合、クエリを手動で再度編集して、新しい地区を追加する必要があります。

個別の地区の名前を動的に取得して上記のクエリを実行できるクエリがあるかどうかを知りたいです。手順を使用してその場でスクリプトを生成できることはわかっていますが、他の方法もありますか?

クエリ「select distinct(districts) from district_details」の出力により、各行に地区名を持つ単一の列が返されるため、これを列に転置したいと思います。

4

4 に答える 4

3

可変数の列を返す静的 SQL ステートメントを使用することはできません。異なる地区の数が変わるたびに、そのようなステートメントを作成する必要があります。そのためには、最初に

SELECT DISTINCT District FROM district_details;

これにより、詳細がある地区のリストが表示されます。次に、前の結果を反復処理する SQL ステートメントを作成します (疑似コード)。

statement = "SELECT name "

For each row returned in d = SELECT DISTINCT District FROM district_details 
    statement = statement & ", SUM(IF(District=""" & d.District & """,1 ,0)) AS """ & d.District & """" 

statement = statement & " FROM district_details GROUP BY name;"

そして、そのクエリを実行します。次に、可変数の列の処理をコードで処理する必要があります

于 2009-10-22T18:31:55.527 に答える
1

a)「Foreach」はMySQLストアドプロシージャではサポートされていません。b)ストアドプロシージャは、いわゆる動的SQLステートメントを使用して連結文字列からプリペアドステートメントを実行することも、複数の個別の行を含む結果を返すこともできません。c)格納された関数は動的SQLをまったく実行できません。

良いアイデアを思いついたら、それを追跡するのは悪夢であり、誰もが「なぜ誰かがしたいのか...」と考える前にそれをデバンキングしているようです。

私はあなたがあなたの解決策を見つけることを願っています、私はまだ私のものを探しています。私が得たクローズは

(擬似コードを失礼します)

->ストアドプロシージャに、関数をビルドします...

1)一時テーブルを作成します2)ifステートメントを使用して列から一時テーブルにデータをロードします3)テーブル呼び出しと同じようにストアドプロシージャのINOUTまたはOUTパラメータに一時テーブルをロードします...複数の行

また、別のヒント...地区を従来のスタイルのテーブルとして保存し、これを読み込んで、アクティブとマークされた地区をループして繰り返し、すべてのシステムケアのプレーンテキストである可能性のあるクエリ文字列を動的に連結します。

次に、を使用します。

@yourqyerstringからstmNameを準備します。stmNameを実行します。割り当て解除準備stmName;

(mysqlフォーラムのストアドプロシージャの部分でも詳細を確認してください)

元の手続きを再設計することなく、毎回異なる地区のセットを実行する

多分それは数値形式で簡単です。私は自分のテーブルのプレーンテキストコンテンツに取り組んでおり、合計、カウント、または合計するものは何もありません

于 2010-03-29T22:56:30.687 に答える
0

以下は、別個の(名前/地区)ペアの一致が必要であることを前提としています。つまり、Luke/CAとDuke/CAは2つの結果をもたらします。

SELECT name, District, count(District) AS count
FROM district_details
GROUP BY District, name

そうでない場合は、GROUPBY句から名前を削除してください。

最後に、値の合計を取得するのではなく、グループ化されたすべての行をカウントしようとしているため、 sum()count( )に切り替えたことに注意してください。

于 2009-10-21T10:28:46.473 に答える
0

上記の@cballouによるコメントを介して、OPが要求したものとはまったく異なりますが、同様の状況に適したこの種の機能を実行できたので、後で来る人を助けるためにここに追加しました.

通常の select ステートメント:

SELECT d.id ID,
       q.field field,
       q.quota quota
  FROM defaults d
  JOIN quotas q ON d.id=q.default_id

垂直方向の結果:

ID field  quota
1  male   25
1  female 25
2  male   50

group_concat を使用してステートメントを選択します。

SELECT d.id ID,
       GROUP_CONCAT(q.fields SEPARATOR ",") fields,
       GROUP_CONCAT(q.quotas SEPARATOR ",") quotas
  FROM defaults d
  JOIN quotas q ON d.id=q.default_id

次に、後でプログラムで簡単に処理できる「フィールド」と「クォータ」のコンマ区切りフィールドを取得します。

横方向の結果:

ID fields      quotas
1  male,female 25,25
2  male        50

魔法!

于 2011-09-30T20:27:35.917 に答える