3

ユーザー ID によって複数の行の結果を 1 つの行の結果に結合する際に問題があります。

私はこの結果を得ます:

||userID||eventTypeID||COUNT(*)||  
||  1   ||    1      ||    1   ||  
||  1   ||    2      ||    1   ||  
||  2   ||    1      ||    1   ||   
||  3   ||    2      ||    1   ||

私がしたいのは、このようにすることです:

||userID||eventTypeID ONE||COUNT()||eventTypeID TWO||COUNT()||

等々...

これを行う方法がわかりません。pivotSQL と concat を試しましたが、うまくいきません。

私のSQLクエリ:

SELECT eventMatch.userID, eventMatch.eventTypeID, COUNT( * )   
FROM  `eventMatch` , activity, activityMatch  
WHERE eventMatch.activityID = activity.activityID  
AND activity.activityID = activityMatch.activityID  
AND activity.khID =1  
GROUP BY eventTypeID, userID  
ORDER BY userID ASC  

誰かが助けてくれることを願っています。おそらく簡単ですが、2日間解決策を探してみました:-)

ありがとう..

4

2 に答える 2

2

これを試して:

SELECT
  eventMatch.userID, 
  SUM(eventMatch.eventTypeID = 1) As TypeOne,
  SUM(eventMatch.eventTypeID = 2) As TypeTwo, 
  COUNT( * )   
FROM  `eventMatch` 
INNER JOIN activity      ON eventMatch.activityID = activity.activityID 
INNER JOIN activityMatch ON activity.activityID = activityMatch.activityID  
WHERE activity.khID =1  
GROUP BY userID  
ORDER BY userID ASC;

更新 1

複数のイベント タイプの場合、次のように動的に実行できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(em.eventTypeID = ''',
      em.eventTypeID, ''', 1, 0)) AS Type',
      em.eventTypeID )
  ) INTO @sql
FROM  `eventMatch`       AS em;

SET @sql = CONCAT('SELECT em.userID, ', @sql,
                  ', COUNT( * )   
                  FROM  `eventMatch`       AS em
                  INNER JOIN activity      AS  a ON em.activityID = a.activityID 
                  INNER JOIN activityMatch AS am ON a.activityID = am.activityID  
                  GROUP BY em.userID  
                  ORDER BY em.userID ASC  ;');

prepare stmt 
FROM @sql;

execute stmt;

SQL フィドルのデモ


更新 2

テーブルからすべてのタイプを含めたい場合はEventTypes、このタイプが他のテーブルに一致しない場合でも、テーブルからタイプを取得するのではなく、最初のステップでこのテーブルからタイプのリストを動的にEventTypes取得してからeventmatch動的に実行する必要があります以前と同じ方法でクエリを実行します。このような:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(em.eventTypeID = ''',
      em.eventTypeID, ''', 1, 0)) AS Type',
      em.eventTypeID )
  ) INTO @sql
FROM  eventTypes       AS em; -- <---------- this is what I changed.


SET @sql = CONCAT('SELECT em.userID, ', @sql,
                  ', COUNT( * )   
                  FROM  `eventMatch`       AS em
                  INNER JOIN activity      AS  a ON em.activityID = a.activityID 
                  INNER JOIN activityMatch AS am ON a.activityID = am.activityID  
                  GROUP BY em.userID  
                  ORDER BY em.userID ASC  ;');

prepare stmt 
FROM @sql;

execute stmt;

更新された SQL Fiddle デモ

于 2013-02-06T09:29:36.720 に答える
0

する

GROUP BY eventMatch.userID, eventMatch.eventTypeID

仕事?

于 2013-02-06T09:29:54.960 に答える