May 25, 2013 at 11:32 am
Hi all, hope in your help.
This is my table:
+----+--------+--------+
| id | field1 | field2 |
+----+--------+--------+
| 1 | A1 | 7 |
| 2 | B1 | 9 |
| 3 | C1 | 0 |
| 4 | D1 | 3 |
| 5 | A2 | 5 |
| 6 | B2 | 6 |
| 7 | C2 | 7 |
| 8 | D2 | 8 |
+----+--------+--------+
I need this output:
+--------+--------------------+
| field1 | field2 |
+--------+--------------------+
| A2 | 19.230769230769200 |
+--------+--------------------+
| B2 | 23,076923076923100 |
+--------+--------------------+
| C2 | 26,923076923076900 |
+--------+--------------------+
| D2 | 30,769230769230800 |
+--------+--------------------+
and tried this query
where calculate the value of single field1 (5,6,7,8) divided by the sum of field2 equal to A1, B2, C2 and D2 (26) :
A = 5/26 * 100 = 19
B = 6/26 * 100 = 23
C = 7/26 * 100 = 26
D = 8/26 * 100 = 30
SELECT
field1,
field2/Sum(field2)*100 as field2
FROM
`tbl_t`
WHERE
1
AND field1 IN ('A2', 'B2', 'C2', 'D2');
+--------+--------------------+
| field1 | field2 |
+--------+--------------------+
| A2 | 19.230769230769234 |
+--------+--------------------+
But the ouput is not what I want, can you help me?
Thank you
Any help would be greatly appreciated.
May 26, 2013 at 2:38 pm
Hi
You could try the following, I wouldn't expect the performance to be the best because of the partition on the RIGHT function. It may be worthwhile making the making a grouping column in your base table
with sampleData as (
select *
from (values
(1,'A1',7)
,(2,'B1',9)
,(3,'C1',0)
,(4,'D1',3)
,(5,'A2',5)
,(6,'B2',6)
,(7,'C2',7)
,(8,'D2',8)
) as sd(id, f1, f2)
)
select f1, (cast(f2 as float) / sum(f2) over (partition by right(a.f1,1))) * 100.0 as f2
from sampleData a
where right(a.f1, 1) = 2
May 26, 2013 at 3:18 pm
thanks so much
May 28, 2013 at 7:30 am
Here is my take on it, I see 2 ways of doing it, both equally efficient just depends on what you want to do
declare @f2 as float;
select @f2 = cast(SUM(field2) as float)
from test
where RIGHT(field1,1)='2';
select field1, field2/@f2*100.0 as field2
from test
where RIGHT(field1,1)='2';
As you can see above, I start by declaring a variable, and then proceed to define it using an aggregate function (sum), and use the same where condition as in the final select, this way I ensure that I have selected the correct fields for the aggregate function to perform the final calculation.
select field1, CAST(field2 as float)/SUM(field2) over (partition by right(field1,1))
* 100.0 as field2
from test
where RIGHT(field1,1)='2';
Now in this example we use the over cluase to avoid having to group any columns not in aggregate functions, and therefore produce a simple one liner.
This in turn produces the results that you are looking for in a simple fashion
field1field2
A219.2307692307692
B223.0769230769231
C226.9230769230769
D230.7692307692308
Jaime Diaz
Lyntek, Inc[/i]
Viewing 4 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic. Login to reply