2014-10-09 3 views
0

Моя таблица выглядит следующим образом:Группировка вертикальных данных для сумм, которые будут использоваться в делении?

Cell Date  Hour Minute Counter Value 
AB1 20141008 14  15  C1  40 
AB1 20141008 14  15  C2  15 
AB1 20141008 14  30  C1  30 
AB1 20141008 14  30  C2  13 

Мне нужно вычислить формулу ПРОЦЕНТОВ, что, если данные были горизонтальными и C1, C2 были колонки, будет выглядеть следующим образом:

SELECT SUM(C2)/SUM(C1) as 'PERCENT' 
FROM [Table] 
group by Cell, Date, Hour 

Я был думая об использовании предложения OVER, но я не уверен, как его реализовать здесь.

В приведенном ниже случае, результат будет:

Cell Date  Hour PERCENT 
AB1 20141008 14  0.40 (Total of C2 = 28/Total of C1 = 70) 

Спасибо.

+0

просто опубликовать вывод, который вы хотите – mohan111

ответ

3

, если данные были горизонтальными и C1, C2 были колонки

Вы можете откинуть данных, чтобы сделать это так:

SELECT 
    Cell, Date, Hour, 
    SUM([C2])*100/SUM([C1]) AS [%], 
    SUM([C2])/CAST(SUM([C1]) AS DECIMAL(10,5)) AS [Percent] 
FROM TABLE1 
PIVOT (SUM(value) FOR Counter in ([C1],[C2])) AS pvt 
GROUP BY Cell, Date, Hour 

Sample SQL Fiddle

Выход:

| CELL |  DATE | HOUR | % | PERCENT | 
|------|----------|------|----|---------| 
| AB1 | 20141008 | 14 | 40 |  0.4 | 
+0

Лот проще проверить это на выпуск нулевой проблемы (если он один.) – Hogan

+0

@Hogan Да, должно быть легко предотвратить div zero; Однако я не добавил. – jpw

+0

Спасибо за сообщение. Как добавить условие нуль в 'CAST' в SELECT? Я предпочитаю не использовать 'HAVING SUM ([C1])> 0' – vmgmail

2

Вы делаете это так:

SELECT Cell, Date, Hour, 
    SUM(CASE WHEN Counter = 'C2' THEN Value ELSE 0 END)/
    SUM(CASE WHEN Counter = 'C1' THEN Value ELSE 0 END) AS Percent 
FROM [table] 
group by Cell, Date, Hour 
+0

нужно добавить ELSE 1, чтобы избежать деления на ноль условия, упаковывают C1 не существует – radar

+0

@Rajesh - Ммм .. . не уверен. Плакат не сказал, что делать в случае нулевого нуля. Я ожидаю, что ситуации никогда не произойдет. – Hogan

1

Используйте CASE и попробовать этот

SELECT Cell, 
     Date, 
     Hour, 
     SUM(CASE WHEN Counter = 'C1' THEN Value 
      ELSE 0 
      END)/ 
     SUM(CASE WHEN Counter = 'C2' THEN Value 
      ELSE 0 
      END) AS 'PERCENT' 
FROM Table 
GROUP BY Cell, Date, Hour 
+0

Мне интересно узнать, почему вы отправили точно такой же ответ, который я разместил. Несколько ответов, которые являются одинаковыми, не являются полезными. – Hogan

+0

@Hogan Это не совсем то же самое, что неверно из-за отсутствия END в операторах case. – jpw

+0

@Hogan Я начал отвечать еще до того, как вы отправили сообщение и не увидели ваш ответ, когда я разместил этот – Ram

Смежные вопросы