0

私は次のデータセットを持っています (私のデータベース/スキーマはやや複雑なので、ここにすべての詳細を含めることは現実的ではないことに注意してください)

これは、ベース テーブルから抽出して作成したデータの簡易版ですview

ワークアウト_アクティビティ_レコード_id 属性_メトリック_ID 属性_メトリック_値 ワークアウト_エクササイズ_set_created_on
234 17 10 2012-02-06 00:00:00
234 18 30 2012-02-06 00:00:00
234 17 20 2012-03-03 00:00:00
234 18 12.9 2012-03-03 00:00:00
234 17 20 2012-04-02 00:00:00
234 18 40 2012-04-02 00:00:00
.
.
. (さらに、workout_activity_record_ids についても同様です)

計算する必要があります (よりよく理解するためにデータを調べます)

総計 = (10 * 30) + (20 * 12.9) + (20 * 40)
月ごとにまとめました。

乗算に役立つ基本的なアプローチは、行を列に転置することです。したがって、上記の構造は次のようになります-

ワークアウト_アクティビティ_レコード_id ex17 ex18 ワークアウト_エクササイズ_set_created_on     
234 10 30 2012-02-06 00:00:00
234 20 12.9 2012-03-03 00:00:00
234 20 40 2012-04-02 00:00:00
.
.
.
.
. (残りのworkout_activity_record_idsについても同様)

このために、私はいくつかの SO 投稿を調べ、さまざまな実行可能/実行不可能 (:D) オプションを試した後、次のクエリを思いつきました。

選択する
       CASE attribute_metric_id
           WHEN '17' THEN attribute_metric_value END AS 'ex17',
       CASE attribute_metric_id WHEN '18' THEN attribute_metric_value END AS 'ex18',
       ワークアウト_エクササイズ_セット_作成_オン
FROM エクササイズ_属性
WHERE ワークアウト_アクティビティ_レコード_id = 234

そして、私が得た実際の出力は

ワークアウト_アクティビティ_レコード_id ex17 ex18 ワークアウト_エクササイズ_set_created_on
234 10 NULL 2012-02-06 00:00:00
234 NULL 30 2012-02-06 00:00:00
234 20 NULL 2012-03-03 00:00:00
234 NULL 12.9 2012-03-03 00:00:00
234 20 NULL 2012-04-06 00:00:00
234 NULL 40 2012-04-02 00:00:00

誰かがこれに光を当てることができますか? ありがたく思います。ありがとう!

4

2 に答える 2

3

これにより、年と月ごとにグループ化された総計が計算されます。

SELECT YEAR(workout_exercise_set_created_on) AS YEAR,
       MONTH(workout_exercise_set_created_on) AS MONTH,
       sum(SubTotal) AS GrandTotal
FROM
  (SELECT workout_exercise_set_created_on,
          max(CASE WHEN attribute_metric_id = 17 THEN attribute_metric_value END) * max(CASE WHEN attribute_metric_id = 18 THEN attribute_metric_value END) AS SubTotal
   FROM MyTable
   GROUP BY workout_exercise_set_created_on) a
GROUP BY YEAR(workout_exercise_set_created_on),
         MONTH(workout_exercise_set_created_on)

SQL フィドルの例

出力

YEAR    MONTH   GRANDTOTAL
2012    2        300
2012    3        258
2012    4        800
于 2012-06-26T15:13:19.447 に答える
1

集計関数を追加するだけです:

SELECT
   MAX(CASE attribute_metric_id
        WHEN '17' THEN attribute_metric_value 
      END) AS 'ex17',
   MAX(CASE attribute_metric_id 
        WHEN '18' THEN attribute_metric_value 
       END) AS 'ex18', 
   workout_exercise_set_created_on
   FROM exercise_attribute
   WHERE workout_activity_record_id =234
   GROUP BY workout_exercise_set_created_on

異なる結果を表示する必要がある場合workout_activity_record_idは、変更する 必要がありますgroup by workout_activity_record_id,workout_exercise_set_created_on

于 2012-06-26T15:06:06.243 に答える