【问题标题】:SQL - Summing from two different tablesSQL - 从两个不同的表中求和
【发布时间】:2014-10-31 01:49:52
【问题描述】:

我试图在两个不同的表中总结两个不同属性中的值,但在执行此操作时遇到问题。所以我的表格结构是:

位置

  • 位置ID (PK)
  • 类型

员工要求

  • 请求 ID (PK)
  • positionID(来自位置的 FK)

招聘

  • 招聘ID(PK)
  • requestID(来自 StaffRequest 的 FK)

定期招聘

  • recruitmentID(PK, FK from Recruitment)
  • numberOfWeeks

RegRecruitWeeklyTime

  • ID (PK)
  • recruitmentID(FK from RegularRecruitment)
  • 小时

因此,这 5 个表与我要执行的查询有关。 RegRecruitWeeklyTime 表将包含正式员工的所有每周时间,并将特定 recruitmentID 的小时数相加将得出招聘人员每周工作的总小时数。 numberOfWeeks 表会告诉你新兵应该工作的小时数。

现在我想编写一个查询,它将给出总小时数和总周数,并按职位类型对它们进行分组。这必须在单个查询中完成。

所以,起初我写了两个查询来执行每个求和。

SELECT
  Position.type AS 'Position',
  SUM(RegularRecuitment.numberOfWeeks) AS 'Total Weeks'
FROM Position, StaffRequest, Recruitment, RegularRecuitment
WHERE 
  Recruitment.recruitmentID = RegularRecuitment.recruitmentID 
  AND
  StaffRequest.requestID = Recruitment.requestID
  AND
  Position.positionID = StaffRequest.positionID
GROUP BY Position.type;

SELECT 
  Position.type AS 'Position',
  SUM(RegRecruitWeeklyTime.hours) AS 'Total hours'
FROM Position, StaffRequest, Recruitment, RegularRecuitment, RegRecruitWeeklyTime
WHERE
  RegRecruitWeeklyTime.recruitmentID = RegularRecuitment.recruitmentID
  AND
  Recruitment.recruitmentID = RegularRecuitment.recruitmentID 
  AND
  StaffRequest.requestID = Recruitment.requestID
  AND
  Position.positionID = StaffRequest.positionID
GROUP BY Position.type;

如果我分别运行这两个查询,它可以正常工作并给我正确的结果。但是,当我像这样组合这两个查询时:

SELECT 
  Position.type AS 'Position', 
  SUM(RegRecruitWeeklyTime.hours) AS 'Total hours each week',
  SUM(RegularRecuitment.numberOfWeeks) AS 'Total Weeks'
FROM Position, StaffRequest, Recruitment, RegRecruitWeeklyTime, RegularRecuitment
WHERE
  RegRecruitWeeklyTime.recruitmentID = RegularRecuitment.recruitmentID
  AND
  Recruitment.recruitmentID = RegularRecuitment.recruitmentID 
  AND
  StaffRequest.requestID = Recruitment.requestID
  AND
  Position.positionID = StaffRequest.positionID
GROUP BY Position.type;

'Total Weeks' 列乘以RegRecruitWeeklyTime 中的行数,表示结果为SUM(RegularRecuitment.numberOfWeeks) * COUNT(RegRecruitWeeklyTime.hours)。如果我将“总周数”列值除以 COUNT(RegRecruitWeeklyTime.hours),我会得到正确的答案,但我只是想知道是否有更好的方法。

谢谢...

【问题讨论】:

  • 您使用的是 MySQL 还是 SQL Server?它们不是一回事。

标签: mysql sql-server database


【解决方案1】:

问题是找到'Total hours' RegRecruitWeeklyTime 表与RegularRecuitment 连接以获得结果,但找到'Total Weeks' 你没有加入RegRecruitWeeklyTime 表所以。当您尝试组合查询时,'total weeks' 显然会有所不同。试试这个..

SELECT A.Position,
       A.Total_Weeks,
       A.Total_hours
FROM   (SELECT Position.type                        AS 'Position',
               Sum(RegularRecuitment.numberOfWeeks) AS 'Total_Weeks'
        FROM   Position
               JOIN StaffRequest
                 ON Position.positionID = StaffRequest.positionID
               JOIN Recruitment
                 ON StaffRequest.requestID = Recruitment.requestID
               JOIN RegularRecuitment
                 ON Recruitment.recruitmentID = RegularRecuitment.recruitmentID
        GROUP  BY Position.type) a
       JOIN (SELECT Position.type                   AS 'Position',
                    Sum(RegRecruitWeeklyTime.hours) AS 'Total_hours'
             FROM   Position
                    JOIN StaffRequest
                      ON Position.positionID = StaffRequest.positionID
                    JOIN Recruitment
                      ON StaffRequest.requestID = Recruitment.requestID
                    JOIN RegularRecuitment
                      ON Recruitment.recruitmentID = RegularRecuitment.recruitmentID
                    JOIN RegRecruitWeeklyTime
                      ON RegRecruitWeeklyTime.recruitmentID = RegularRecuitment.recruitmentID
             GROUP  BY Position.type) b
         ON A.Position = B.Position 

【讨论】:

    【解决方案2】:

    你用的是什么数据库??

    如果你使用的是 sqlserver

    你总是可以这样做

    SELECT 
    (
      SELECT
        Position.type AS 'Position',
        SUM(RegularRecuitment.numberOfWeeks) AS 'Total Weeks'
      FROM Position, StaffRequest, Recruitment, RegularRecuitment
      WHERE
        Recruitment.recruitmentID = RegularRecuitment.recruitmentID 
        AND
        StaffRequest.requestID = Recruitment.requestID
        AND
        Position.positionID = StaffRequest.positionID
      GROUP BY Position.type
    ) AS select1,
    
    (
      SELECT
        Position.type AS 'Position',
        SUM(RegRecruitWeeklyTime.hours) AS 'Total hours'
      FROM Position, StaffRequest, Recruitment, RegularRecuitment, RegRecruitWeeklyTime
      WHERE
        RegRecruitWeeklyTime.recruitmentID=RegularRecuitment.recruitmentID
        AND
        Recruitment.recruitmentID = RegularRecuitment.recruitmentID 
        AND
        StaffRequest.requestID = Recruitment.requestID
        AND
        Position.positionID = StaffRequest.positionID
      GROUP BY Position.type
    ) AS select2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多