代码之家  ›  专栏  ›  技术社区  ›  Adam Nelson

规范化和(SQL)的汇总列.第1部分

  •  0
  • Adam Nelson  · 技术社区  · 17 年前

    object_id | vote
    1 | 2
    1 | -1
    1 | 5
    2 | 3
    2 | 1
    3 | 4
    3 | -2
    

    我想要这个结果(对于这个特定的例子,对象_id 1和2是在别处定义的组的一部分,我正在寻找规范化的_分数,以便总和始终=1。对象_id 3是未使用组的一部分。):

    object_id | normalized_score
    1 | 6/10
    2 | 4/10
    

    [下午3:05添加]10这是第(1,2)项中对象id的投票总数。(1,2)还有一套完整的逻辑,我只是想提出一个最清晰的问题,这样人们就不用担心这一部分了。

    如果我做一个自连接,我可以得到总和。我不知道如何得到标准化的和。理想情况下,这将在MySQL 5.x和Sqlite3中都能工作。否则,我可以通过两个单独的查询来完成这项工作,并且只需在后处理中完成这项工作。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Sam Axe    17 年前

    不补偿反对票的解决方案(我包括这一个,因为它更容易阅读/理解):

    SELECT object_id
    ,      SUM(vote) + '/' + total AS normalized_score
    FROM   tabel
    ,      (
           SELECT sum(vote) AS total
           FROM   tabel
           ) 
    GROUP BY object_id, total
    

    SELECT object_id
    ,      SUM(vote + minvote) + '/' + (total + minvote * count) AS normalized_score
    FROM   tabel
    ,      (
           SELECT sum(vote) AS total
           ,      CASE WHEN MIN(vote) < 0 THEN
                      -MIN(vote)
                  END AS minvote
           ,      COUNT(*) AS count
           FROM   tabel
           ) 
    GROUP BY object_id, total, minvote, count
    

    (我没有访问MySQL的权限,所以我在Oracle中编写了一个查询,并将| | for+替换为。希望它能在MySQL中工作,或者至少有帮助:)

        2
  •  1
  •   user78706 user78706    17 年前

    选择object_id作为ObjectID,选择SUM(投票)+'/10'作为NormalizedVote 从桌子上 按对象\u id分组

        3
  •  1
  •   Nidjarow Nidjarow    17 年前
    选择
    ((案例符号(最小(投票))当-1时,则最小(投票)否则0)*
    从桌子上
    按对象\u id分组