2011-06-01 112 views
3

我有2选择语句,并希望将它们合并,以便它们显示在1个表中。结合2选择语句

选择1:

SELECT 
LAST_DAY, SUM(BILLABLE), AVG(BILLABLE) 
FROM EMPLOYEES 
GROUP BY YEAR(LAST_DAY),WEEK(LAST_DAY) ORDER BY LAST_DAY 

选择2:

SELECT BILLABLE 
FROM EMPLOYEES 
WHERE NAME LIKE '$lookup%' 

这里的目标是展示每周全体员工的结算金额和平均(第一个SELECT语句),然后用添加列特定的“查找”员工在该周的可结算金额。

这两个陈述都单独运作良好,但如果他们能够轻松地比较他们每周与平均水平的比较情况,那么这对员工来说就会更有意义。

编辑为例:

EMPLOYEE表看起来是这样的

 
NAME | LAST_DAY | BILLABLE 
Bob 05/13/2011 18.5 
Mary 05/13/2011 12.68 
Steve 05/13/2011 15.2 
Bob 05/06/2011 14.1 
Mary 05/06/2011 11.17 
Steve 05/06/2011 23.62 

我想要查询的结果是这个样子:
假设$查找==“鲍勃”

 
LAST_DAY | ALL_BILLABLE_TOTAL | ALL_BILLABLE_AVG | EMPLOYEE_BILLABLE_TOTAL 
05/13/2011  46.38    15.46     18.5 
05/06/2011  48.89    16.29     14.1 

+0

对于每位员工,每周有一行? – 2011-06-01 13:05:06

+0

是的。每个员工每周有一个记录。有~50个workersss。 – mikepreble 2011-06-01 13:44:35

回答

2

“查找”行的东西看起来可能是一个混乱,所以我会质疑你的设计。此外,它看起来像你的“员工”表实际上不是员工的行,而是每周的销售行或其他东西。它看起来不像它的3NF,这可能会导致你很多头痛。无论如何,我认为这会做你想要什么:

SELECT 
    SQ.last_day, 
    SQ.all_billable_total, 
    SQ.avg_billable_total, 
    LU.billable AS employee_billable_total 
FROM 
    (
     SELECT 
      E.last_day, 
      SUM(E.billable) AS all_billable_total, 
      AVG(E.billable) AS avg_billable_total, 
     FROM 
      Employees 
     WHERE 
      name NOT LIKE '$lookup%' 
     GROUP BY 
      E.last_day 
    ) SQ 
LEFT OUTER JOIN Employees LU ON 
    LU.name LIKE '$lookup%' AND 
    LU.last_day = SQ.last_day 

的加入到查找行会导致多种结果,如果您有符合加入该多行。如果这仅仅是一个行理货,本周的销量,然后摆脱那些行,并且做这样的事情:

SELECT 
    E.last_day, 
    SUM(CASE WHEN name = @name THEN E.billable ELSE NULL END) AS all_billable_total, 
    AVG(CASE WHEN name = @name THEN E.billable ELSE NULL END) AS avg_billable_total, 
    SUM(E.billable) AS employee_billable_total 
FROM 
    Employees E 
WHERE 
    E.last_day IN (SELECT last_day FROM Employees WHERE name = @name) 
GROUP BY 
    E.last_day 

您需要使用NULL的CASE语句,因为使用0将甩开平均水平。

+0

除了内部select语句中的where子句之外,第一个示例运行良好,这并不是真正需要的。我拿出来,查询工作得很好。非常感谢你的帮助。 – mikepreble 2011-06-01 15:17:02

+0

不客气。我将删除该部分代码。我原以为你试图为单个员工获取信息。 – 2011-06-01 15:26:12

+0

另请注意......我添加了一张支票,以便您不计算正常总计中的“查找”行。如果可以,请将这些行从数据中提取出来。 – 2011-06-01 15:30:26