GROUP BY Проблема - PullRequest
       2

GROUP BY Проблема

0 голосов
/ 11 декабря 2010

У меня есть таблица SQL Server 2005 с именем Users:

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

Я хочу получить СУММУ проблем для каждого Имени, СУММУ Значение, если Вкл. Истина, СУММУ Значение, если ВЫКЛ.истина между указанными датами:

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

Попробуйте:

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 голосов
/ 11 декабря 2010

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

Если «Вкл» и «Выкл» действительно являются взаимоисключающими состояниями, и вы просто сделали глупые вещи, то лучший способ получить результат-установить строки, которые находятся во включенном состоянии, и строки, которые находятся в нерабочем состоянии, - это использовать 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)}

Вы также можете создать два постоянных представления, одно для включенных строк, а другое для выключенных строк и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 голосов
/ 11 декабря 2010

Следующее должно сделать трюк:

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]
...