2010-12-11 6 views
0

У меня есть сервер 2005 таблица SQL называется пользователей:GROUP BY Проблема

UserID | Date  | Name | Issues | On | Off | Value 
1  | 02/02/2010 | John | 3  | True | False | 75 
2  | 07/23/2010 | Nate | 7  | False | True | 50 
3  | 02/12/2010 | John | 5  | False | True | 45 
4  | 01/29/2010 | John | 8  | True | False | 65 
5  | 09/01/2010 | Nate | 6  | True | False | 30 
6  | 12/07/2010 | John | 2  | False | True | 40 
7  | 07/18/2010 | Nate | 10  | True | False | 80 

Я хочу, чтобы получить SUM вопросов для каждого имени, сумма стоимости, когда на это верно, то сумма стоимости, когда Off соответствует датам:

Name | No of issues| SUM of ON | SUM of OFF 
John | 18   | 140  | 85 
Nate | 23   | 110  | 50 

Спасибо!

+0

ваш «On» и Столбцы «Выкл.» Взаимоисключающие? О, и любой шанс, что вы могли бы форматировать свой вопрос немного яснее, делает его очень трудным для чтения, как есть. – RichardW1001

+0

Если вы отправляете код или XML, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

ответ

0

Следующая следует сделать трюк:

SELECT Users.[NAME], 
     SUM(Users.Issues) As Issues, 
     SUM(CASE WHEN Users.[On] THEN Users.[Value] ELSE 0 END) AS On, 
     SUM(Case WHEN Users.[Off] THEN Users.[Value] ELSE 0 END) As Off 
FROM Users 
GROUP BY Users.[NAME] 
+0

Я хочу, чтобы столбец SUM значения, когда ON имеет значение ИСТИНА, и когда OFF - true. – milo2010

+0

Извините, я просто замечаю, что сам (был слишком занят расшифровкой исходного вопроса, спасибо за редактирование, кстати) – MartinStettner

+0

(И, конечно, я забыл 'END' ...) – MartinStettner

2

Попробуйте это:

SELECT 
    Name, 
    SUM(issues), 
    SUM(CASE [On] WHEN 1 THEN Value ELSE 0 END) 'Sum ON', 
    SUM(CASE [On] WHEN 0 THEN Value ELSE 0 END) 'Sum OFF' 
FROM 
    dbo.testuser 
GROUP BY 
    Name 

Это даст мне желаемый результат вы упоминаете.

0

Обычно в таблице нет двух столбцов, один из которых называется ON, а другой вызывается OFF, в таблице, поскольку они обычно являются взаимоисключающими состояниями, а два столбца позволяют им быть True. Обычно вам нужен только один столбец с именем ON, который может быть установлен на False, чтобы указать off-state. Итак, что здесь происходит с вашим столом, не совсем понятно.

Если включено и выключено, действительно являются взаимоисключающими состояниями, и вы просто делаете что-то по-дурацко, тогда лучший способ попасть в строки результатов, которые находятся в состоянии состояния, и строки, находящиеся в выключенном состоянии, использовать UNION.

  select {desired columns for rows that are on), sum(value) as YourSum 
      where on=true 
      group by {group-by column(s)} 
      UNION 
      select {desired columns for rows that are off}, sum(value) as YourSum 
      where off=true 
      group by {group-by column(s)} 

Вы также можете создать два постоянных взглядов, один для On строк, а другой для Off Ряды и UNION выбирает против них.

Если вы хотите, отдельные столбцов, используя вышеупомянутую UNION подход, вы можете создать фиктивный столбец, подзапрос, и кормить суммы через фиктивную совокупность MAX() функцию:

  select name, max(OnSum) as OnSummed, max(OffSum) as OffSummed from 
      (

      select name, sum(value) as OnSum, 0 as OffSum 
      from mytable 
      where on= true 
      group by name 
      union 
      select name, 0 as OnSum, sum(value) as OffSum 
      from mytable 
      where off=true 
      group by name 

     ) 
      group by name 
+0

Я не могу изменить таблицу .. Он был разработан таким образом! :) – milo2010

+0

Справедливо. Не вы, но кто-то еще делал что-то, может быть, пустяком. :-) – Tim

+0

Тим, это не работает! Мне нужны суммы для разных имен. – milo2010