【发布时间】:2014-08-15 07:07:26
【问题描述】:
我正在尝试为我的数据库编写一个查询,但在将其到达需要的位置时遇到了一些严重的问题。
我需要它做什么:
除列出其他事项外,它还需要检查 HoursWorked 表,找出哪些员工在 4 月份工作并列出。然后它需要列出这些员工工作的小时数(COUNT)
我将向您展示我整理的内容,但由于时间已晚,我的想法已经不多了:
SELECT
(cl.CommonName + '(' + cl.LegalName + ')') AS ClientName,
p.ProjectName,
(e.LastName + ', ' + e.FirstName) AS EmpName,
SUM(wh.HoursWorked) AS Hours,
br.Rate,'$'+FORMAT((Rate * SUM(HoursWorked)), '#,0.00') TotalCharges,
(con.LastName + ', ' + con.FirstName + ' - ' + con.AddrLine1 + ' ' + con.AddrLine2) AS Contact
FROM
Clients cl,
Projects p,
Employees e,
WorkHours wh,
BillingRates br,
Contacts con,
Contracts cont
WHERE
cl.ClientID = cont.ClientID
AND cont.ContractID = p.ContractID
AND e.Level = br.Level
AND e.TitleID = br.TitleID
AND e.EmpId = wh.EmpId
AND EXISTS
( SELECT * FROM WorkHours
WHERE WH_Month = 4 )
GROUP BY
cl.CommonName,
cl.LegalName
ORDER BY
ClientName,
p.ProjectName,
EmpName
这是我的架构:
结果应包括:
- 客户名称
- 合同名称
- Project(s) 从当月第一天到当月最后一天记录项目小时数的员工
- 每个员工在当月记录的总小时数
- 员工率
- 每位员工的总费用(即员工费率 x 员工工作时间)
- 帐单联系人 - 每个合同的 [姓名、地址]
【问题讨论】:
-
如果是关于员工和他们的工作时间,为什么还要将客户包括在查询中?还是您的意思是每位员工和客户的小时数?
-
首先,尽量不要使用旧式连接:sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…。例如:您的查询中没有联系人的
WHERE子句 -
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式应该不再使用,而是建议使用ANSI-92 SQL 标准引入的正确的 ANSI JOIN 语法(20 多年前)
-
ClientName 是必需的输出之一。
-
嗯,我想我需要弄清楚如何更努力地加入他们。我从来没有真正为超过 2 个表使用过 ANSI Join。查询的一项规定是它必须在一个查询中包含所有内容
标签: sql sql-server