SQL Server - запрос каждой группы группы - PullRequest
0 голосов
/ 08 ноября 2011

У меня такой запрос:

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, которая дает мне исходные строки каждой группы? Или, возможно, лучший способ написать запрос?

1 Ответ

1 голос
/ 09 ноября 2011

Полагаю, вы просто хотите:

SELECT Code
     , AVG(CASE WHEN ColumnA<>0 THEN ColumnA ELSE NULL END) AS ColumnA
     , SUM(ColumnB) AS ColumnB
FROM Table tbl
GROUP BY Code
...