5

我有一个查询可以正常工作以提取公司 A 的一系列目标和总工作时间。我想为公司 B 运行完全相同的查询并在一个公共日期加入它们,该日期恰好按周分组。我目前的查询:

SELECT * FROM (
  SELECT org, date,
         ( SELECT SUM( target ) FROM target WHERE org = "companyA" ) AS companyA_target,
         SUM( hours ) AS companyA_actual
  FROM time_management_system
  WHERE org = "companyA"
  GROUP BY WEEK( date )
  ORDER BY DATE
) q1

LEFT JOIN (
  SELECT org, date,
         ( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
         SUM( hours ) AS companyB_actual
  FROM time_management_system
  WHERE org = "companyB"
  GROUP BY WEEK( date )
  ORDER BY DATE
) q2 

ON q1.date = q2.date

结果显示公司A的所有日期/信息,但公司B仅显示零星数据。另外,这两个查询将显示完全相同的日期集,只是“目标”和“实际”列中的信息不同。

companyA    2012-01-28  105.00  39.00   NULL      NULL          NULL   NULL 
companyA    2012-02-05  105.00  15.00   NULL      NULL          NULL   NULL
companyA    2012-02-13  105.00  60.50   companyB  2012-02-13    97.50  117.50

知道为什么我没有获得公司 B 的所有信息吗?

作为旁注,是否有人能够指出将每行的周值转换为列的方向?只有companyA和companyB是两行?

我感谢所有的帮助!谢谢。

4

2 回答 2

1

你的两个子查询都是错误的。

要么你想要这个:

SELECT 
org,
WEEK(date),
( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
SUM( hours ) AS companyB_actual
FROM time_management_system
WHERE org = "companyB"
GROUP BY WEEK( date )

否则你想要这个:

SELECT 
org,
date,
( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
SUM( hours ) AS companyB_actual
FROM time_management_system
WHERE org = "companyB"
GROUP BY date

您现在执行的方式不是正确形成 SQL。在几乎任何其他数据库中,您的查询都会立即失败并出现错误。MySQL 更宽松,运行查询但给出不确定的结果。

于 2012-04-27T21:23:52.930 回答
1

如果目标表中没有明显的日期,则总和将在所有周内保持不变。因此,我只对 A 公司和 B 公司的那些“组织”值进行了预查询,并带有 group by。这将确保每个“组织”只有 1 条记录,因此您不会得到笛卡尔结果。

然后,我正在查询两家公司的 time_management_system ONCE。在字段计算中,我正在应用 IF() 来测试公司价值并在正确时应用。最终结果中两者的WEEK活动是相同的,所以我不必单独做并加入。这也避免了日期列出现两次的需要。我也不需要显式添加 org 列名,因为最终的列名反映了这一点。

SELECT
      WEEK( tms.date ) as GrpWeek,
      IF( tms.org = "companyA", TargetSum.CompTarget, 00000.00 )) as CompanyATarget,
      SUM( IF( tms.org = "companyA", tms.hours, 0000.00 )) as CompanyAHours,
      IF( tms.org = "companyB", TargetSum.CompTarget, 00000.00 )) as CompanyBTarget,
      SUM( IF( tms.org = "companyB", tms.hours, 000.00 )) as CompanyBHours
   from
      Time_Management_System tms
         JOIN ( select 
                      t.org,
                      SUM( t.target ) as CompTarget
                   from 
                      Target T
                   where
                      t.org in ( "companyA", "companyB" ) 
                   group by
                      t.org ) as TargetSums
            ON tms.org = TargetSums.org
   where 
      tms.org in ( "companyA", "companyB" )
   group by
      WEEK( tms.date )
   order by
      WEEK( tms.date )
于 2012-04-27T23:35:29.573 回答