1

这是我的第一篇文章,我是 SQL 新手

我有一张像

H     Amount    Count      ID 

h1      2         1         x
h2      3         2         x
h3      5         3         x
h1      3         3         x
h1      1         5         y
h2      3         2         x
h3      1         1         x
h3      2         3         y
h2      5         5         y

我希望每个 H 组的 SUM(Amount*Count) 基于该 H 组中的 id / Total SUM(Amount*Count)

IE

H     value       ID

h1     11/16       x                     value =  (2*1+3*3)/2*1+3*3+1*5 
h1      5/16       y                     value =   1*5/ 2*1+3*3+1*5 
h2      12/37      x 
h2      25/37      y 
h3      16/22      x 
h3       6/22      y

我的目标是按 H 分组,然后在每个组上我必须做 - Sum(average*count) Over(partition by ID) / Sum(average*count)

但我无法编写这样的查询,你们能帮帮我吗?对格式表示抱歉谢谢

4

3 回答 3

1

尝试这个:

SELECT t2.h, t1.value1/t2.value2, t1.id  
FROM 
     (SELECT sum(value) as value1, id  from table
      group by id) as t1, 
     (SELECT sum(value) as value2, h  from table
      group by h) as t2
WHERE t1.h = t2.h
于 2012-07-22T21:33:47.487 回答
0

简单的答案是使用这样的内部查询:

SELECT SUM(Amount * Count), (SELECT SUM(Amount * Count) FROM table AS t2 WHERE t2.H = t1.H)
FROM table AS t1
GROUP BY H, ID

这实质上是指同一个表作为两个不同t1t2查询。

但是,您使用的特定数据库管理系统(MySQL、Microsoft SQL Server、sqlite 等)可能具有处理此类事情的内置函数。您应该查看您的 DBMS 提供的内容(或在此处使用特定平台标记您的问题)。

于 2012-07-22T21:37:15.007 回答
0

你想要做的是获得被除数(每组的金额*计数的总和)并在另一个子选择中h -> id加入除数(每组的金额*计数的总和):h

SELECT 
    a.h, a.id, a.dividend / b.divisor AS value
FROM
(
    SELECT h, id, SUM(amount*count) AS dividend
    FROM tbl
    GROUP BY h, id
) a 
INNER JOIN
(
    SELECT h, SUM(amount*count) AS divisor
    FROM tbl
    GROUP BY h
) b ON a.h = b.h
于 2012-07-22T21:40:41.073 回答