2011-10-19 23 views
2

我有以下結構的表寫作爲MySQL的SQL查詢和SQL Server

id name field1 field2 field3 
1 aaa 20  30  40 
2 aaa 40  50  60 
3 bbb 40  50  60 
4 aaa 75  55  60 
5 bbb 40  50  60 
6 bbb 40  50  60 

我想要的結果集是

1 aaa (sum of field 1) (product of field 2) (average of field3) 
2 bbb (sum of field 1) (product of field 2) (average of field3) 

我無法找出如何做到這一點。我試過

select SUM(field1),PROD(field2),AVG(field3) from table GROUP BY name 

但它不工作。另外我需要找出如何在sql server 2005中做到這一點。

+1

通過'Prod'要乘組中的所有值?他們都是正數嗎? –

回答

4

對於SQL Server,你可以使用

SELECT SUM(field1), 
     CASE 
     WHEN COUNT(CASE 
         WHEN field2 = 0 THEN 1 
        END) > 0 THEN 0 
     ELSE 1 
     END * CASE COUNT(CASE WHEN SIGN(field2) = -1 THEN 1 END)%2 
       WHEN 0 THEN 1 
       ELSE -1 
      END * EXP(SUM(LOG(ABS(NULLIF(field2, 0))))), 
     AVG(field3) 
FROM T 
GROUP BY name 
+0

結果是正確的先生 – rahularyansharma

+0

@史密斯我檢查一下,它的工作正常,現在請你描述你已經做了field2產品 – rahularyansharma

+2

@rahularyansharma:這是簡單的數學:'log(A * B * ... Z)= logA + loB + ... + logZ',因此:'A * B * ... * Z = exp(logA + loB + ... + logZ)'(更多解釋請參考對數標識) –

0

嘗試:

select name, SUM(field1),PROD(field2),AVG(field3) from table GROUP BY name 
+0

SQL Server沒有PROD() – StuartLC

+0

除非您編寫了一個名爲'PROD'的UDF,否則沒有'PROD()'函數可用。 – Widor

+0

我猜這就是他用'PROD()'表示的意思,如果不是的話,你可以爲它創建自己的函數。 – SNpn

0
create table product(
id int identity(1,1), 
_name varchar(max), 
field1 int, 
field2 int, 
field3 int 
) 
create table #_name(
id int identity(1,1), 
_name varchar(max), 
field1 int, 
field2 int, 
field3 int 
) 
insert into product values ('aaa',20,30,40) 
insert into product values ('aaa',40,50,60) 
insert into product values ('bbb',40,50,60) 
insert into product values ('aaa',75,55,60) 
insert into product values ('bbb',20,30,40) 
insert into product values ('bbb',40,50,60) 
insert into product values ('ddd',40,50,60) 
insert into product values ('ddd',40,50,60) 
insert into product values ('ddd',40,50,60) 

declare @name varchar(max); 
declare @sum int,@prod int, @avg int; 
declare @field2 int; 
set @prod=1; 

select * from product 
declare pro_cursor cursor for 
select p._name from (select distinct(_name) from product)p 
open pro_cursor 
fetch next from pro_cursor into @name 
while(@@fetch_status=0) 
begin 
    declare field_cursor cursor for 
    select field2 from product where [email protected] 
    open field_cursor 
    fetch next from field_cursor into @field2 
    while(@@fetch_status=0) 
    begin 
     set @[email protected]*@field2;   
    fetch next from field_cursor into @field2 
    end 
    close field_cursor 
    deallocate field_cursor 
    set @sum=(select sum(field1) from product where [email protected]); 
    set @avg=(select avg(field3) from product where [email protected]); 
insert into #_name values (@name,@sum,@prod,@avg) 
set @prod=1; 
fetch next from pro_cursor into @name 
end 
select * from #_name 
close pro_cursor 
deallocate pro_cursor 
truncate table #_name