0

データベースにデータがあります

userid    module      course     total
  8      Biophysics     A          117
  8      BioPhysics     B           74
  8      BioPhysics     C          135

次のような出力が必要です

userid      module       Courses        grade   
 8        BioPhysics    Course A: 117    250
                        Course B: 134  
                        Course C: 35
4

1 に答える 1

2

あなたが達成しようとしていることはPIVOT、行データを別々の列に「ing」することと呼ばれ、MySQLではサポートされていない機能ですが、ピボットしたいデータの範囲を事前に知っていれば、それを偽造することができます列に。


いくつかのオプションがあります。

この例では、組み合わせごとにAB、およびCがあります。の値がAB、またはCのみであると仮定すると、次のように各値に対して条件付き集計を実行できます。courseuserid -> modulecourse

  SELECT userid,
         module,
         MAX(CASE course WHEN 'A' THEN total END) AS A,
         MAX(CASE course WHEN 'B' THEN total END) AS B,
         MAX(CASE course WHEN 'C' THEN total END) AS C,
         SUM(total) AS grade
    FROM tbl
GROUP BY userid, 
         module 

CASE必要な数の集計を追加できます( DEFなど)。たとえば、 forの行が含まれていない場合、一部の列のuserid -> module組み合わせによっては、一部の列に含まれる可能性があることに注意してください。NULLCcourse

ただし、値の範囲が事前にわからない場合(および、に数百の異なる値が存在する可能性があるcourse場合でも、すべてのデータを1つの行に取得できますが、個別の列には含まれません。実際には1つになります。単一の列に連結された文字列。これは、次を使用して実行されますGROUP_CONCAT()

  SELECT userid,
         module,
         GROUP_CONCAT(CONCAT(course, ': ', total) SEPARATOR ' / ') AS coursetotals,
         SUM(total) AS grade
    FROM tbl
GROUP BY userid,
         module

そして、これが行うことは、次のような出力です。

userid  |  module      |  coursetotals             |  grade
-------------------------------------------------------------
8       |  BioPhysics  |  A: 117 / B: 74 / C: 135  |  326

これが両方のオプションのSQL-Fiddleデモです


編集:あなたのコメントと編集に従って、ここに新しい解決策があります:

SELECT 
    a.userid, 
    a.module, 
    CONCAT('Course ', course, ': ', total) AS Courses, 
    b.grade
FROM
    tbl a
INNER JOIN
(
    SELECT userid, module, SUM(total) AS grade
    FROM tbl 
    GROUP BY userid, module
) b ON a.userid = b.userid AND a.module = b.module
于 2012-07-14T05:12:39.193 に答える