【问题标题】:SQL Server Query FormulationSQL Server 查询公式
【发布时间】: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


【解决方案1】:

尝试换掉这个:

AND EXISTS 
( SELECT * FROM WorkHours
    WHERE WH_Month = 4 )

有了这个:

WHERE wh.WH_Month = 4

您在查询中的内容是“如果表中有任何月份 = 4 的记录,请在我的结果中给我这条记录,无论它与哪个月份相关”。没有任何东西将“当前”结果与月份联系起来,因此它将返回每条记录。

编辑:我也支持为当前方法替换老式逗号连接,并且在您的架构中,我没有看到很多外键关系或任何与您选择的表相关的内容......例如,你怎么知道给定项目/合同的客户是什么?值得深思。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2021-04-07
    相关资源
    最近更新 更多