У меня такой запрос:
SELECT A, B, C,
CASE
WHEN 1 = (
SELECT COUNT(DISTINCT D)
FROM MyTable tbl2
WHERE tbl2.A = tbl.A AND tbl2.B = tbl.B and tbl2.C = tbl.C
)
THEN (
SELECT AVG(D)
FROM MyTable tbl3
WHERE tbl3.A = tbl.A AND tbl3.B = tbl.B and tbl3.C = tbl.C
)
ELSE SUM(D)
FROM MyTable tbl
GROUP BY A, B, C
Кто-нибудь знает лучший способ написать этот запрос?
Что бы я действительно хотел, вместо того чтобы дважды запрашивать таблицу, - это запросить каждую группу группы в операторе выбора. Это вообще возможно?
Я предполагаю, что можно выполнить своего рода JOIN, но если бы я настоятельно предпочел запросить каждую группу исходных строк, которые объединяются вместе (для формирования группы).
Я работаю на SQL Server 2005.
Заранее спасибо за помощь!
РЕДАКТИРОВАТЬ: 2011-11-09
В свете некоторых вопросов, мне кажется, я недостаточно четко объяснил свои цели. Я надеюсь, что это изменение послужит лучшим примером:
Мой вопрос таков: когда я делаю группу, есть ли способ запроса строк в таблице, которые составляют каждую группу в операторе select? Есть ли какое-нибудь ключевое слово / функция SQL? Вот что я имею в виду:
Table:
| Code | Qty | ColumnA | ColumnB |
| A | 100 | 3 | 100 |
| A | 100 | 4 | 200 |
| A | 0 | 0 | 300 |
| B | 0 | 0 | 400 |
| B |100 | 1 | 500 |
SELECT Code, SUM(ColumnB),
(SELECT AVG(ColumnA) FROM Table WHERE Code = tbl.Code AND Qty <> 0) AS ColumnA
FROM Table tbl
GROUP BY Code
Вывод, который я ищу:
| Code | ColumnA | ColumnB |
| A | 3.5 | 600 |
| B | 1 | 900 |
Как видите, я бы хотел избежать этого вложенного запроса, запросив 3 строки в таблице, из которой состоит группа A. Знаете ли вы ключевое слово или функцию SQL, которая дает мне исходные строки каждой группы? Или, возможно, лучший способ написать запрос?