これは、以前のデータで機能します。の別のセットの平均が同じになると、問題が発生しますVAL
。
SQL フィドル
MS SQL Server 2012 スキーマのセットアップ:
CREATE TABLE t
([Val] int, [Avg] int)
;
INSERT INTO t
([Val], [Avg])
VALUES
(1, 3),
(5, 3),
(2, 3),
(5, 7),
(6, 7),
(5, 7)
;
クエリ 1 :
SELECT t.*,
CASE WHEN t2.cnt >= 3 THEN 1 ELSE 0 END as BelowAvg
FROM t
LEFT OUTER JOIN (SELECT avg, count(*) as cnt
FROM t
WHERE val < avg
GROUP BY avg) t2 ON t.avg = t2.avg
結果:
| VAL | AVG | BELOWAVG |
|-----|-----|----------|
| 1 | 3 | 0 |
| 5 | 3 | 0 |
| 2 | 3 | 0 |
| 5 | 7 | 1 |
| 6 | 7 | 1 |
| 5 | 7 | 1 |
編集:これが質問に関連していると仮定すると、次のようなものを持つことができます:
SQL フィドル
MS SQL Server 2012 スキーマのセットアップ:
CREATE TABLE t
([QuestionID] int, [Val] int, [Avg] int)
;
INSERT INTO t
([QuestionID], [Val], [Avg])
VALUES
(1, 1, 3),
(1, 5, 3),
(1, 2, 3),
(2, 5, 7),
(2, 6, 7),
(2, 5, 7)
;
クエリ 1 :
SELECT t.*,
CASE WHEN t2.cnt >= 3 THEN 1 ELSE 0 END as BelowAvg
FROM t
LEFT OUTER JOIN (SELECT QuestionID, count(*) as cnt
FROM t
WHERE val < avg
GROUP BY QuestionID) t2 ON t.QuestionID = t2.QuestionID
結果:
| QUESTIONID | VAL | AVG | BELOWAVG |
|------------|-----|-----|----------|
| 1 | 1 | 3 | 0 |
| 1 | 5 | 3 | 0 |
| 1 | 2 | 3 | 0 |
| 2 | 5 | 7 | 1 |
| 2 | 6 | 7 | 1 |
| 2 | 5 | 7 | 1 |