13

ドライバー名でグループ化された、個々の列がゼロより大きい合計回数をカウントしようとしています。今私は持っています。

SELECT drivername
      , COUNT(over_rpm)      AS RPMViolations
      , COUNT(over_spd)      AS SpdViolations
      , COUNT(brake_events)  AS BrakeEvents
  FROM performxbydriverdata
 WHERE  over_rpm > 0
    OR over_spd > 0
    OR brake_events > 0
GROUP BY drivername

これにより、ゼロ以外の値がすべて得られますが、次のように表示されます。

  • ボブ・スミス 62 62 62
  • ネイサン・ジョーンズ 65 65 65

個々の値ごとにゼロ以外の数を取得しようとしています..各違反は個別にグループ化する必要があります。

4

2 に答える 2

27

NULLIF を使用してゼロを NULL に変更します。count は NULL を無視します

SELECT drivername,
     COUNT(NULLIF(over_rpm,0)) AS RPMViolations,
     COUNT(NULLIF(over_spd,0)) AS SpdViolations,
     COUNT(NULLIF(brake_events,0)) AS BrakeEvents
FROM performxbydriverdata
GROUP BY drivername;

おそらく、このグループで WHERE 句も削除して、パフォーマンスを向上させることができます。
または、適切なインデックスと一致するため、条件がうまく実行されないことがよくあります。

HAVING を使用すると(他の回答のように)、3つの集計がすべてゼロである行が削除されます。これは、役立つ場合とそうでない場合があります。必要に応じてこれを追加できます。つまり、WHERE は、少なくとも 1 つの行にゼロ以外の値があることを意味するため、WHERE 句と HAVING 句の両方は必要ありません。

于 2013-05-27T14:16:11.040 に答える
8

ケースステートメントを使用して Sum() 関数内にフィルター述語を配置することは、述語条件に基づいてアイテムをカウントする必要がある場合に便利なトリックです。

Select DriverName,
    Sum(case When over_rpm > 0 Then 1 Else 0 End) OverRpm,
    Sum(case When over_spd > 0 Then 1 Else 0 End) OverSpeed,
    Sum(case When brake_events > 0 Then 1 Else 0 End) BrakeEvents,
    etc.
FROM performxbydriverdata
Group By DriverName
于 2013-05-27T14:18:05.560 に答える