得到另一行GROUP BY行的SUM

时间:2012-10-25 10:36:06

标签: php mysql group-by sum

我有这张桌子:

table

对于不同的var_lines(这几乎可以作为一行数据或调查的响应者)和set_codes(不同的调查代码),这个选择被重复多次。

使用此查询:

SELECT
    *, COUNT(*) AS total
FROM
    `data`
WHERE
    `var_name` = 'GND.NEWS.INT'
AND(
    `set_code` = 'BAN11A-GND'
    OR `set_code` = 'BAN09A-GND'
    OR `set_code` = 'ALG11A-GND'
)
AND `country_id` = '5'
GROUP BY
    `data_content`,
    `set_code`
ORDER BY
    `set_code`,
    `data_content`

查询基本上计算特定问题的答案数。然后将他们分组调查(set_code)。

我需要的是GND.NEWS.INT的每个分组data_content答案,以显示所有相应的GND_WT与相同var_line的SUM。

例如,如果我有这个:

data_id    data_content    var_name    var_line
1          2               GND.NEW.INT 1
2          1.4             GND_WT      1
3          2               GND.NEW.INT 2
4          1.6             GND_WT      2
5          3               GND.NEW.INT 3
6          0.6             GND_WT      3

我会得到这样的东西:

data_id    data_content    var_name      var_line   total   weight
1          2               GND.NEW.INT   1          2       3
5          3               GND.NEW.INT   3          1       0.6

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您的要求并不十分清楚,但我认为以下内容可为您提供所需内容:

select d1.data_id,
  d1.data_content,
  d1.var_name,
  d1.var_line,
  t.total,
  w.weight
from data d1
inner join
(
  select data_content,
    count(data_content) Total
  from data
  group by data_content
) t
  on d1.data_content = t.data_content
inner join
(
  select var_line,
    sum(case when var_name = 'GND_WT' then data_content end) weight
  from data
  group by var_line
) w
  on d1.var_line = w.var_line
where d1.var_name = 'GND.NEW.INT'

请参阅SQL Fiddle with Demo

答案 1 :(得分:1)

此查询可能适合您的具体示例:

select st.data_id, 
    st.data_content, 
    st.var_name, 
    st.var_line, 
    count(st.data_id) as total,
    sum(st1.data_content) as weight
from data st
left join data st1 on st1.var_name = 'GND_WT' AND st1.var_line=st.var_line
where st.var_name='GND.NEW.INT'
group by st.data_content

此致

路易斯。