1

次のテーブル構造があります

+-------+------------+-----------+---------------+
| id    |assigned_to | status    |  group_id     |              
+-------+------------+-----------+---------------+
| 1     | 1001       | 1         |    19         |
+-------+------------+-----------+---------------+
| 2     | 1001       | 2         |    19         |
+-------+------------+-----------+---------------+
| 3     | 1001       | 1         |    18         |
+-------+------------+-----------+---------------+
| 4     | 1002       | 2         |    19         |
+-------+------------+-----------+---------------+
| 5     | 1002       | 2         |    19         |
+-------+------------+-----------+---------------+

以下の形式で情報を取得したい

+-------+------------+-----------+
|       |   1001     |   1002    |          
+-------+------------+-----------+
| 1     |    1       |    0      |   
+-------+------------+-----------+
| 2     |    1       |    2      |   
+-------+------------+-----------+

したがって、基本的には、割り当てられたフィールドを列名として使用しようとしています。次に、行はステータスを表します。たとえば、テーブルには、ユーザー 1002 のステータスが 2 の 2 つの行があるため、その特定のステータス行に合計が表示されます。

は 19 でなければならないことに注意してくださいgroup_id。したがって、テーブルで ID 3 の行を省略したのはなぜですか。

誰かが私を正しい方向に向けることができますか?このタイプのクエリには名前があると確信していますが、私の人生ではこれを言葉にすることはできません。他にもさまざまなクエリを試しましたが、どれもこれに近づきません。

4

2 に答える 2

1

この記事を読みたいかもしれませんhttp://www.artfulsoftware.com/infotree/qrytip.php?id=523

私は次のようになります

SELECT 
  assigned_to, 
  COUNT( CASE assigned_to WHEN '1001' THEN 1 ELSE 0 END ) AS '1001', 
  COUNT( CASE assigned_to WHEN '1002' THEN 1 ELSE 0 END ) AS '1002'
FROM table
WHERE group_by = 19
GROUP BY assigned_to WITH ROLLUP; 

またはそのようなもの(私はこのコードをテストしていません..)

記事では、彼はあなたがそれをしSUM()なければならないことを使用してそれをCOUNT()行い、group_idのWHERE制約を追加します

お役に立てれば

于 2013-10-24T15:24:52.103 に答える
1

Marc B の言うとおりです。assigned_to の値がある程度固定されていると仮定するなど、いくつかの仮定をしない限り、テーブルをピボットする方法、つまりフィールドの内容を列に変換する方法はありません。

一方、これはプログラムで解決できる種類の問題です。簡単なプログラムではありませんが、仕事はできます。

私は最近、これに似たプログラムを Java で作成しました。興味があれば、そのコアをここに投稿できます。

于 2013-10-24T15:28:23.413 に答える