2

これは、システム内の異なるセンサーを参照する 3 つの異なる「アドレス」から毎日の値を収集するために使用しているクエリです。

SELECT DISTINCT
    LEFT(changes.date_time, 6) AS 'date',
    changes.address AS 'address',
    (CASE WHEN changes.address IN (18) THEN - MAX(changes.value * types.multiplier) ELSE MAX(changes.value * types.multiplier) END) AS 'value'
FROM sensor.changes
INNER JOIN sensor.types ON changes.type = types.idx
WHERE
    changes.address IN (1, 4, 8)
    AND changes.date_time >= '12110100000000'
    AND changes.date_time <= '13050100000000'
GROUP BY LEFT(changes.date_time, 6),
    changes.address
ORDER BY changes.idx;

最初の日付には次の値が含まれ、その後の日付には同じアドレスが含まれます。

date   address value
130203 1        0.0160
130203 4        0.1220
130203 8       -0.0070

これら 3 つの値、住所 1+4+8 を、その日付の 1 つの行に結合したいと考えています。「値」列で SUM を試みましたが、SQL エラーが発生しました: #1111 - Invalid use of group function。2 番目の GROUP BY 列を取り出すと、日付ごとに 1 つの値になりますが、値はそれらの値の合計ではありません。2 番目のクエリを使用して結果をフォーマットしても問題ありませんが、データベース サーバーがローカルではないため、最初のクエリで計算を行った方がよいでしょう。

編集:結果として必要なものを明確にするために:

date   address value
130203 1       0.131

この場合、列の下の整数addressは重要ではありません。

4

1 に答える 1

2

グループ化句を追加する必要があります。

SELECT Resdate,SUM(Res.address),SUM(Res.value)
FROM
(
SELECT DISTINCT
    LEFT(changes.date_time, 6) AS 'date',
    changes.address AS 'address',
    (CASE WHEN changes.address IN (18) THEN - MAX(changes.value * types.multiplier) ELSE MAX(changes.value * types.multiplier) END) AS 'value'
FROM sensor.changes
INNER JOIN sensor.types ON changes.type = types.idx
WHERE
    changes.address IN (1, 4, 8)
    AND changes.date_time >= '12110100000000'
    AND changes.date_time <= '13050100000000'
GROUP BY LEFT(changes.date_time, 6),
    changes.address
ORDER BY changes.idx
) AS Res
GROUP BY Res.Date
于 2013-02-03T22:39:37.043 に答える