2014-10-09 35 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 2014-10-09 14:36:54

回答

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

Lot很容易檢查這個div零問題(如果它是一個)。 – Hogan 2014-10-09 15:00:36

+0

@Hogan是的,應該很容易防止div零;我沒有添加它。 – jpw 2014-10-09 15:03:23

+0

感謝您的發帖。如何在SELECT中的「CAST」中添加div零條件?我寧願不使用'HAVING SUM([C1])> 0' – vmgmail 2014-10-09 15:32:53

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 2014-10-09 14:50:18

+0

@Rajesh - 嗯.. 。 不確定。海報沒有說明在div零案件中該做什麼。我預計這種情況將永遠不會發生。 – Hogan 2014-10-09 14:52:05

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 2014-10-09 14:53:46

+0

@Hogan這不完全相同,因爲在案件陳述中遺漏了END,這是不正確的。 – jpw 2014-10-09 14:55:06

+0

@Hogan我甚至在你發佈之前就開始了答案,當我發佈這個 – Ram 2014-10-09 14:55:19