2011-06-14 6 views
3

を外部結合左のクエリでは、時間ごとにpricepointにより、グループの取引ということです:MySQLはここでトラブル

SELECT hour(Stamp) AS hour, PointID AS pricepoint, count(1) AS counter 
FROM Transactions 
GROUP BY 1,2; 

出力例:

+------+------------+---------+ 
| hour | pricepoint | counter | 
+------+------------+---------+ 
| 0 |   19 |  5 | 
| 0 |   20 |  14 | 
| 1 |   19 |  3 | 
| 1 |   20 |  12 | 
| 2 |   19 |  2 | 
| 2 |   20 |  8 | 
| 3 |   19 |  2 | 
| 3 |   20 |  4 | 
| 4 |   19 |  1 | 
| 4 |   20 |  1 | 
| 5 |   19 |  4 | 
| 5 |   20 |  1 | 
| 6 |   20 |  2 | 
| 8 |   19 |  1 | 
| 8 |   20 |  4 | 
| 9 |   19 |  2 | 
| 9 |   20 |  5 | 
| 10 |   19 |  6 | 
| 10 |   20 |  1 | 
| 11 |   19 |  10 | 
| 11 |   20 |  2 | 
| 12 |   19 |  10 | 
| 12 |   20 |  3 | 
| 13 |   19 |  10 | 
| 13 |   20 |  10 | 
| 14 |   19 |  8 | 
| 14 |   20 |  3 | 
| 15 |   19 |  6 | 
| 15 |   20 |  8 | 
| 16 |   19 |  11 | 
| 16 |   20 |  10 | 
| 17 |   19 |  7 | 
| 17 |   20 |  17 | 
| 18 |   19 |  7 | 
| 18 |   20 |  9 | 
| 19 |   19 |  10 | 
| 19 |   20 |  12 | 
| 20 |   19 |  17 | 
| 20 |   20 |  11 | 
| 21 |   19 |  12 | 
| 21 |   20 |  29 | 
| 22 |   19 |  6 | 
| 22 |   20 |  21 | 
| 23 |   19 |  9 | 
| 23 |   20 |  23 | 
+------+------------+---------+ 

あなたが見ることができるように、いくつかの時間は(何のトランザクションを持っていません(例えば午前7時)、ある時間は単一の価格ポイント(例えば午前6時、価格ポイント20のみ、価格ポイント19については取引なし)に対する取引を有する。

トランザクションがない場合は、結果が「0」で表示されるようにしたいと思います。

LEFT OUTER JOINと一緒に作業しようとしています。 inHourテーブルに値0..23

SELECT H.hour, PointID AS Pricepoint, COALESCE(T.counter, 0) AS Count 
FROM inHour H 
LEFT OUTER JOIN 
(
SELECT hour(Stamp) AS Hour, PointID, count(1) AS counter 
FROM Transactions 
GROUP BY 1,2 
) T 
ON T.Hour = H.hour; 

が含まれていますこれは(簡潔にするために切り捨て)以下の出力を生成します。

| 5 |   19 |  4 | 
| 5 |   20 |  1 | 
| 6 |   20 |  2 | 
| 7 |  NULL |  0 | 
| 8 |   19 |  1 | 
| 8 |   20 |  4 | 

私が実際に希望することは次のようになります。

| 5 |   19 |  4 | 
| 5 |   20 |  1 | 
| 6 |   19 |  0 | 
| 6 |   20 |  2 | 
| 7 |   19 |  0 | 
| 7 |   20 |  0 | 
| 8 |   19 |  1 | 
| 8 |   20 |  4 | 

希望の出力では、指定された時間内に取引がなかった価格ポイントの隣に値「0」が表示されます。

あなたの提案は大歓迎です!ありがとう。

+0

はおそらく、あなたはすべての異なるpricepointsを選択する副選択に参加残さ?そうでなければ、私はpricepointsのディメンションテーブルに行くだろう。 –

+0

それは私がAndrewの答えに触発されてしまったことです。 – emx

答えて

3
SELECT h.Hour, p.Pricepoint, COUNT(t.*) AS Count 
FROM inHour h, 
(SELECT DISTINCT PointId AS Pricepoint FROM Transactions) p 
LEFT OUTER JOIN Transactions t 
ON h.Hour = hour(t.Stamp) AND p.Pricepoint = t.PointID 
GROUP BY h.Hour, p.Pricepoint 
ORDER BY h.Hour, p.Pricepoint 

私はこれを試してみる時間がありませんので、うまくいかない場合は調整してみてください。

+0

Andrewさん、本当に感動してくれてありがとうございました。私はあなたの例を使って動作させることができました。 – emx

0

誰かが、おそらくこれよりもよりよい解決策を持っていますが、私は物事を単純化するためにUNIONを使用します。

SELECT hour(Stamp) AS hour, PointID AS pricepoint, count(1) AS counter 
FROM Transactions 
GROUP BY 1,2 

UNION 

SELECT hour,0 AS pricepoint,0 AS counter FROM inHour WHERE hour NOT IN (SELECT hour(Stamp) FROM Transactions) 
+0

ユニオンですか?これがここの最適な解決策であるとは思わない... –