【问题标题】:sql query to sum values in the two least columns out of five columnssql查询对五列中最少两列的值求和
【发布时间】:2018-05-06 09:10:10
【问题描述】:

名为“StudentResults”的数据库表存储学生科目测试的结果。这些测试是根据性能分级的。所以有数学分数、法语分数、英语分数、科学分数和农业分数的等级。我想创建一个查询,该查询将检查并总结整个五个不同结果中的两个最少结果。
例如。约翰数学 = 40 法语 = 50 英语 = 60 科学 =30 农业 = 70。在五门科目考试中,最少的两个成绩分别是 30 和 40。我如何编写查询来总结它们。下表示例:

|姓名 |数学 |法语 |英语 |科学 |农业 | 两个_最少 |
-------------------------------------------------- --------------------------------------
|詹姆斯|| 30.0 | 50.0  | 70.0 | 10.0    | 70.0  | 40.0 |
|乔希| 10.0 | 30.0  | 40.0 | 10.0    | 70.0  | 20.0 |
|珍妮特| 20.0 | 60.0  | 70.0 | 80.0    | 90.0  | 80.0        |



詹姆斯最少两个是数学 = 30 科学 = 10。Two_Least = 40
乔希最少两个是数学 = 10 科学 = 10。Two_Leats = 20
珍妮特两个最少是数学 = 20 法语 = 60。Two_Least = 80

请我如何编写一个sql查询来解决这个问题。非常感谢大家。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • sqlite 请@jarlh
  • 我会考虑规范化您的数据库。在没有一堆 CASE 语句的情况下,在 SQLite 中没有真正的好方法
  • 我计划通过网络文件夹共享文件,以便许多计算机可以访问它。在套接字和服务器套接字@kbball 方面不太好。这就是为什么我为这个老板选择了 sqlite。我会非常感谢你的回答,老板。
  • SQLite 不是问题...。理想情况下,您应该将姓名、主题、分数作为您的行结构 - 因此您在下面看到的所有联合

标签: sql sqlite


【解决方案1】:

我你正在使用SQL ServerOracle 12c 你可以使用:

SELECT t.*, s.two_least
FROM t
CROSS APPLY (SELECT SUM(val)
             FROM (
               SELECT ROW_NUMBER() OVER (ORDER BY z.val) AS rn, z.val
               FROM (
                 SELECT t.Maths UNION ALL       --FROM dual
                 SELECT t.French UNION ALL
                 SELECT t.English UNION ALL
                 SELECT t.Science UNION ALL
                 SELECT t.Agric
                 ) z(val)
              ) v
              WHERE rn IN (1,2)
           ) s(two_least);

Rextester Demo


SQLite 版本(应该通过某种id 进行关联):

SELECT *, MIN(Maths, French, English, Science, Agric) + 
( SELECT  Maths AS s FROM t t2 WHERE t.Name = t2.Name UNION ALL 
  SELECT  French     FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  English    FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  Science    FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  Agric      FROM t t2 WHERE t.Name = t2.Name
  ORDER BY s LIMIT 1,1
) AS result
FROM t;

DBFiddle Demo

正确方法:规范化您的架构。


编辑:

MySQL 支持 LEAST 函数:

SELECT *, LEAST(Maths, French, English, Science, Agric) + 
( SELECT  Maths AS s FROM t t2 WHERE t.Name = t2.Name UNION ALL 
  SELECT  French     FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  English    FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  Science    FROM t t2 WHERE t.Name = t2.Name UNION ALL
  SELECT  Agric      FROM t t2 WHERE t.Name = t2.Name
  ORDER BY s LIMIT 1,1
) AS result
FROM t;

db<>fiddle demo

【讨论】:

  • OP 刚刚说的是 sqlite。
  • @jarlh 在原始问题中只有 SQL 标记。总之很容易适应。
  • @lad2025 您的回答是否适用于 sqlite?抱歉没有包含 sqlite 标签。我的道歉。
  • 谢谢@LukaszSzozda,它工作得很好。非常感谢。你真的很好,也是一位很棒的老师。
  • @LukaszSzozda 非常感谢。你真的是一个救生员。很荣幸见到你。有没有你卖老板的教程。我非常想注册成为你的学生
【解决方案2】:

如果这是我的选择 - 我会有一个单独的表,即 - Grades (StudentId, Class, Grade) 是表 2,Student (StudentId, Name) - 这将使查询变得更加容易。

Lad 的解决方案对你有用,但重组桌子似乎是明智的。

【讨论】:

  • 感谢您的查询代码@lad2025。会试试的老板。愿你永远幸福。
【解决方案3】:

我找到了一种将其更新为真实列的方法。它的..

String sql = "update t set Agregate=(SELECT MIN(Maths,French,English,Science,Agric) + " +
"( SELECT  Maths AS s FROM t t2 WHERE t.ID = t2.ID UNION ALL " +
"  SELECT  French FROM t t2 WHERE t.ID = t2.ID UNION ALL" +
"  SELECT  English FROM t t2 WHERE t.ID = t2.ID UNION ALL" +
"  SELECT  Science FROM t t2 WHERE t.ID = t2.ID UNION ALL" +
"  SELECT  Agric FROM t t2 WHERE t.ID = t2.ID" +
"  ORDER BY s LIMIT 1,1" +
") AS result WHERE ID = t.ID

非常感谢我的老板。我高度赞赏每一个人的努力。谢谢@lad2025。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-02-03
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多