【问题标题】:Sum hours value, count and display based on hours using SQL使用 SQL 根据小时数求和小时值、计数和显示
【发布时间】:2020-06-23 06:45:32
【问题描述】:

我有两张表,分别是教师和活动。

CREATE TABLE teacher (
TeacherId INT, BranchId VARCHAR(5));
INSERT INTO teacher VALUES
("1121","A"),
("1132","A"),
("1141","A"),
("2120","B"), 
("2122","B");
                               
CREATE TABLE activities (
ID INT, TeacherID INT,    Hours   INT);

INSERT INTO activities VALUES
(1,1121,2),
(2,1121,1),
(3,1132,1),
(4,1141,NULL),
(5,2120,NULL),
(6,2122,NULL);

NULL 表示没有活动,将在输出表上转换为 0。我想生成一个查询来计算总小时数并根据教师小时数计算有多少活动,如下表:

   +-----------+------------+------------+
   |   Hours   |     A      |     B      |
   +-----------+------------+------------+
   |     0     |     1      |     2      |
   |     1     |     1      |     0      |
   |     2     |     0      |     0      |
   |     3     |     1      |     0      |
   +-----------+------------+------------+

已编辑:对不起,我不知道如何准确地阐述,但这是我从其他成员https://www.db-fiddle.com/f/mmtuZquKyUqdhPvTFN9qaF/1收到的小提琴

编辑:最后,修改需要,将小时数相加并根据分支 ID 和教师 ID 计算小时数作为输出。

此处的预期输出(红色文本):https://drive.google.com/file/d/1wyZ_aX5hz_7I1Ncf5sXLpstYk6FT8PMg/view?usp=sharing

【问题讨论】:

  • Null表示活动数未知

标签: mysql sql


【解决方案1】:

我们可以通过使用加入聚合子查询的小时日历表来处理这个问题:

SELECT
    t1.Hours,
    SUM(CASE WHEN t2.BranchId = 'A' THEN t2.cnt ELSE 0 END) AS A,
    SUM(CASE WHEN t2.BranchId = 'B' THEN t2.cnt ELSE 0 END) AS B
FROM (SELECT 0 AS Hours UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1
LEFT JOIN
(
    SELECT t.BranchId, COALESCE(a.Hours, 0) AS Hours, COUNT(*) AS cnt
    FROM Teacher t
    LEFT JOIN Activities a ON a.TeacherId = t.TeacherId
    GROUP BY t.BranchId, COALESCE(a.Hours, 0)
) t2
    ON t1.Hours = t2.Hours
GROUP BY
    t1.Hours
ORDER BY
    t1.Hours

Demo

【讨论】:

  • 感谢您的解决方案,但它没有解决另一个问题,即根据教师活动计算小时数。根据数据,如果他们有相同的 id,它假设总结教师的总小时数。例如,根据数据,第 3 行的 A 应该有 1 个计数,因为教师 ID 1121 进行了 2 个活动,分别是 1 和 2 小时。
  • 查看 Gordon 对您的 cmets 的回复。您应该在这里接受答案。
【解决方案2】:

这基本上是一个 JOIN 和聚合。 . .但你需要从你想要的所有时间开始:

SELECT h.Hours,
       COALESCE(SUM(t.BranchId = 'A'), 0) AS A,
       COALESCE(SUM(t.BranchId = 'B'), 0) AS B
FROM (SELECT 0 AS Hours UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
     ) h LEFT JOIN
     activities a
     ON h.hours = COALESCE(a.hours, 0) LEFT JOIN
     teacher t
     ON t.TeacherId = a.TeacherId
GROUP BY h.Hours
ORDER BY h.Hours;

Here 是一个 dbfiddle。

【讨论】:

  • 感谢您的解决方案,但它没有解决另一个问题,即根据教师活动计算小时数。根据数据,如果他们有相同的 id,它假设总结教师的总小时数。例如,根据数据,第 3 行的 A 应该有 1 个计数,因为教师 ID 1121 进行了 2 个活动,分别是 1 和 2 小时。
  • @HanisHarun 。 . .这回答了此处提出的问题,并提供了一个 dbfiddle,说明该解决方案完全产生了您所要求的。如果您有不同的问题,则应将其作为问题提出,并提供适当的解释、示例数据和所需结果。你应该接受这个问题的答案之一。
  • 答案并不能解决根据教师 ID 和按分支分组计算小时数的问题。我在此处更新小提琴:db-fiddle.com/f/mmtuZquKyUqdhPvTFN9qaF/1 并在此处更新预期输出:drive.google.com/file/d/1wyZ_aX5hz_7I1Ncf5sXLpstYk6FT8PMg/…
猜你喜欢
  • 2013-03-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
相关资源
最近更新 更多