在MySQL中对动态创建的列进行SUMing

时间:2014-07-10 10:30:20

标签: mysql

更新:不确定我尝试实现的目标是否可行,但感谢所有帮助 - 请求将其删除是否合适?我不希望贡献者失去我给予他们帮助的赞成。

更新:只是要清楚,当我说列创建动态'我的意思是没有开发者输入所以他们是未知的。它们仍然是标准数据库表中正确定义的列 - 我只是不知道所有这些列的名称。 :-D

我有一个动态创建列的表(很少但是我试图使其尽可能健壮)。我需要输出这些列的SUM,按最高顺序排序,但显然也需要第一行中的列名(否则数据无用)。我已经使用 information_schema.columns 方法将列检索到PHP中,并且我认为我会迭代执行SUM的列,但如果我这样做,则不会以数字方式对它们进行排序。

这可以内置到SP中(假设由于复杂性,它必须在SP中完成)。我相信我可能需要参与“PIVOT'某处,但这是我的知识极限!

总结一下(看看我在那里做了什么:-D)

我有一个包含这样的列的表定义:

volunteerID INT
yearAdded DATETIME
willySize111to120 INT
willySize121to130 INT
willySize131to140 INT
willySize141to150 INT

我想在查询中返回这样的数据集,我可以指定年份:

sizeBracket             count
willySize111to120       98
willySize121to130       76
willySize131to140       54
willySize141to150       23

每当我想到我已经想出办法时,我就会碰到另一堵墙。

感谢您的帮助或指示!

鲍勃

1 个答案:

答案 0 :(得分:1)

假设您的原始表格在每个志愿者的正确括号中都有1,而在所有其他括号中都有0

  SELECT bracket.sizeBracket, COUNT(*) count
    FROM (
    SELECT CASE 
             WHEN willySize111to120 THEN 'willySize111to120'
             WHEN willySize121to130 THEN 'willySize121to130'
             WHEN willySize131to140 THEN 'willySize131to140'
             WHEN willySize141to150 THEN 'willySize141to150'
           END CASE sizeBracket
      FROM  ... -- < Table Name
      WHERE ... -- < Date Selection Logic
         ) bracket
GROUP BY sizeBracket
ORDER BY count DESC

<强>更新

基于带有列

的原始数据表willySize
volunteerID INT
  yearAdded DATETIME
  willySize INT

您可以运行以下查询

  SELECT 
      CONCAT(
        'willySize',
        ROUND(willySize-6,-1)+1,
        'to',
        ROUND(willySize+4,-1)
      ) sizeBracket,
      COUNT(*) count
    FROM willySize
GROUP BY sizeBracket
ORDER BY count DESC