【问题标题】:SQL - How To Return A Result Without MultiplesSQL - 如何返回没有倍数的结果
【发布时间】:2012-08-13 18:21:35
【问题描述】:

我正在尝试编写一个业务对象报告以显示在选定日期未返回时间表的人员列表,但我不知道如何阻止 SQL 查询返回个人的多个条目。

我的 Staff_Table 包含 2 列 - 员工编号和姓名 我的 Timesheet_Table 包含员工编号和 Week_Ending_Date 等信息。

我可以很容易地编写一个语句来返回所有输入时间表的用户,例如 Week_Ending_Date 2012 年 10 月 8 日。但是,如果我尝试返回所有未填写 2012 年 8 月 10 日时间表的人的列表,我会选取表中没有该日期的每个时间表,例如,如果一个人有提交了 100 个时间表,其中只有 1 个是 10/08/2012,结果将显示他 99 次。 我需要的是 Staff_Table 上没有在该日期提交的每个人的固定列表,仅显示一次。

我尝试了一个不存在的联合,但要么我做错了,要么就是不合适。

谁能指出我正确的方向?

【问题讨论】:

  • 此时包含您的查询会有所帮助
  • 我使用了 DISTINCT,但在这里没有帮助。
  • 我知道,我必须在发布之前稍微稀释一下查询。它是由 Business Objects 自动生成的,包含各种形式的连接等。我需要将其过滤以发布以使其与我的问题保持一致。

标签: sql-server business-objects


【解决方案1】:

您应该首先选择所有未输入时间表的员工编号。然后,使用 NOT IN 过滤列表。

DECLARE @Week_Ending_Date DATETIME = '2012-08-10'
DECLARE @Staff TABLE
(
    EmployeeNo INT NOT NULL,
    EmployeeName NVARCHAR(100) NOT NULL
)
DECLARE @TimeSheet TABLE
(
    EmployeeNo INT NOT NULL,
    Week_Ending_Date DATETIME
)

INSERT INTO @Staff (EmployeeNo, EmployeeName)
VALUES (1, 'Alan'), (2, 'Peter')

INSERT INTO @TimeSheet (EmployeeNo, Week_Ending_Date)
VALUES (1, '2012-08-10'), (1, '2012-08-17'), (2, '2012-08-03')

SELECT
    S.EmployeeName
FROM
    @Staff S
WHERE
    EmployeeNo NOT IN (SELECT EmployeeNo FROM @TimeSheet WHERE Week_Ending_Date = @Week_Ending_Date)

【讨论】:

    【解决方案2】:

    尝试将 DISTINCT 添加到您的查询中

    SELECT DISTINCT ...
    

    您的查询应该类似于

    SELECT * 
    FROM Staff
    WHERE NOT EXISTS 
    (
        Select EmployeeNo 
        from Timesheet 
        where WeekEndingDate='2012-08-10'     
        and TimeSheet.EmployeeNo  = Staff.EmployeeNo 
    )
    

    SELECT * 
    FROM Staff
    WHERE EmployeeNo NOT IN 
    (
        Select EmployeeNo 
        from Timesheet 
        where WeekEndingDate='2012-08-10'
    )
    

    【讨论】:

    • 应该提到,我试过了,它不会改变我的结果。
    • 感谢 Podiluska 和大家。在这里使用 NOT IN 命令就可以了。另一个教训。谢谢。
    • Podiluska 在 kingkong0924 之后发布了not in,恕我直言,谁值得称赞
    【解决方案3】:

    您可以使用not exists 子句查找尚未提交特定时间表的员工:

    select  *
    from    Staff s
    where   not exists
            (
            select  *
            from    Timesheet t
            where   t.EmployeeNo =  s.EmployeeNo
                    and t.Week_Ending_Date = '2012-08-19'
            )
    

    【讨论】:

      【解决方案4】:

      您不能只选择所有尚未提交时间表的员工并按他们的姓名对结果进行分组吗?

      select Name
      from Staff_Table
      left join Timesheet_Table on Staff_Table.[Employee No] = Timesheet_Table.[Employee No] and  Timesheet_Table.Week_Ending_Date = '10 August 2012'
      having Timesheet_Table.Week_Ending_Date is null
      group by Name, Timesheet_Table.Week_Ending_Date
      

      我没有测试过这个,但是类似的东西。

      【讨论】:

      • 您不能在having 子句中使用未聚合的列
      猜你喜欢
      • 2017-07-07
      • 2023-04-04
      • 1970-01-01
      • 2013-02-19
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多