sql - 连接具有两个任务列表和用户列表的表

标签 sql t-sql left-join inner-join

我有一个关于在我为我们的业务构建的查询中加入用户表的问题。这是一份基于用户完成的 7 项不同任务的小型生产力报告。

有两个任务表: 1) list 任务 2)请求的任务

请求的任务是 list 任务的扩展。 请求的任务具有请求的日期列,该列位于请求的任务表中 请求的任务具有“完成日期”列,该列位于“检查 list 任务”表中。

当我运行下面的查询时,显然 SecurityIdentity 表仅通过 CompletedByID 与 Checklist Task 表连接以显示其全名。

任务名称“记录文档”是一个请求 list ,具有请求日期(来自请求任务表的 RequestedDate)和接收日期(来自 list 表的完成日期),来自如上所述的两个不同的表。

SELECT o.number   AS 'OrderNo',
       s.fullname AS 'CPC Emp',
       Max(CASE
             WHEN t.description = 'Loan Package to Lender' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'Loan Pck To Lender',
       Max(CASE
             WHEN t.description = 'Recording Audit' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'Recording Audit',
       Max(CASE
             WHEN t.description = 'Recorded Docs' THEN
             Dateadd(hour, -4, rt.requesteddate)
             ELSE NULL
           END)   AS 'Recorded Docs Requested',
       Max(CASE
             WHEN t.description = 'Recorded Docs' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'Recorded Docs Received',
       Max(CASE
             WHEN t.description = 'Recorded Docs to Lender' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'Recorded Docs to Lender',
       Max(CASE
             WHEN t.description = 'Recorded Docs to Purchaser' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'Recorded Docs to Purchaser',
       Max(CASE
             WHEN t.description = 'Title Policy to Lender' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'TP to Lender',
       Max(CASE
             WHEN t.description = 'Title Policy to Purchaser' THEN
             Dateadd(hour, -4, t.completeddate)
             ELSE NULL
           END)   AS 'TP Purchaser'
FROM   pf.orderinfo oi
       INNER JOIN pfm.[order] o
               ON ( o.rootid# = oi.rootid )
       INNER JOIN core.profile op
               ON ( oi.owningprofileid = op.id )
       INNER JOIN zref.orderstatus os
               ON ( oi.orderstatus = os.id )
       INNER JOIN zref.producttype pt
               ON ( o.producttypeid = pt.id
                    AND pt.id <> '15' )
       INNER JOIN pfm.task t
               ON ( t.rootid# = oi.rootid
                    AND ( t.description IN ( 'Loan Package to Lender',
                                             'Recording Audit',
                                                 'Recorded Docs to Lender',
                                             'Recorded Docs to Purchaser',
                                             'Title Policy to Lender',
                                             'Title Policy to Purchaser'
                                             ,
                                                   'Recorded Docs' ) ) )
       LEFT OUTER JOIN pfm.requestedtask rt
                    ON ( rt.rootid# = t.rootid#
                         AND rt.id# = t.id#
                         AND rt.lastid# = t.lastid# )
       LEFT OUTER JOIN core.securityidentity s
                    ON ( s.id = t.completedbyid )
WHERE  ( op.NAME LIKE 'BH104%' -- WNCW Res Profiles Begin.
          OR op.NAME LIKE 'CL170%'
          OR op.NAME LIKE 'CM104%'
          OR op.NAME LIKE 'IN103%'
          OR op.NAME LIKE 'SF107%'
          OR op.NAME LIKE 'AW170%'
          OR op.NAME LIKE 'JW170%'
          OR op.NAME LIKE 'KH170%'
          OR op.NAME LIKE 'PM170%'
          OR op.NAME LIKE 'SC170%'
          OR op.NAME LIKE 'EC102%'
          OR op.NAME LIKE 'MT175%'
          OR op.NAME LIKE 'CU108%'
          OR op.NAME LIKE 'NF106%'
          OR op.NAME LIKE 'GA105%'
          OR op.NAME LIKE 'SL105%'
          OR op.NAME LIKE 'PC135%'
          OR op.NAME LIKE 'PE103%'
          OR op.NAME LIKE 'OC130%'
          OR op.NAME LIKE 'WF130%'
          OR op.NAME LIKE 'SS100%'
          OR op.NAME LIKE 'SO191%'
          OR op.NAME LIKE 'CA115%'
          OR op.NAME LIKE 'DO115%'
          OR op.NAME LIKE 'WC115%'
          OR op.NAME LIKE 'WO115%' --WNCW RES Profiles End.
             AND op.enabled = 1
             AND oi.istemplate = 0
             AND oi.number NOT LIKE '%test%'
             AND oi.number NOT LIKE 'tr%' )
       AND oi.number = 'WC115-13-0048'
       AND s.fullname IS NOT NULL
GROUP  BY s.fullname,
          o.number
ORDER  BY 2 DESC  

当我查询这个sql时,结果是红色方 block 中的: Result

但是,史黛西没有提出这样的要求,但凯西提出了。因此,结果日期/时间戳应该显示为 Kathy 请求的记录文档,而不是 Stacey。

我尝试了许多不同的方法来加入 securityidentity 表来纠正这个问题,但无法做到这一点。任何帮助将不胜感激!

这是三个表: 任务 enter image description here

请求的任务 enter image description here

安全身份

enter image description here

最佳答案

我认为您的问题可能与您要加入任务表的 ID 有关。正如现在所写,无论谁请求该任务,您都将显示完成该任务的人员的姓名,因为您已加入 CompletedByID。如果请求与分配同义,那么您应该加入AssignedToID。无论如何,您需要弄清楚您想要显示谁的名字并加入适当的 ID。

以下是我注意到可以更改/改进的其他一些内容:

  1. OR op.NAME LIKE 'WO115%' 后缺少右括号。除非您确切地知道要做什么,否则绝对不应该允许在同一组括号内组合使用 OR 和 AND 语句。

  2. 您可以将所有像 'XXXX%' 这样的 op.Name 替换为 in()

使用下面的函数,如果您的姓名未编入索引或者您有大量记录,您可能会发现速度明显减慢。您现在的方式并没有错,但使用下面所示的 in() 可能会更容易。

LEFT(op.Name,4) in('XXXXX%','YYYYY%',...,'ZZZZZ%')
  • 最后,您在这里向我们提供了大量信息,这使我们可以更轻松地为您提供帮助。也就是说,您给了我们大量信息。据我所知,我可以看出您的业务与抵押贷款或财务有关,这意味着有人可能对您的数据结构感兴趣。此外,您还向我们提供了表名称、模式名称和少数员工的姓名。我不是黑客,但我可以想象有人可能会发现这些信息有用。将来,我会考虑更改一些业务关键信息或模糊屏幕截图中的更多数据。
  • 关于sql - 连接具有两个任务列表和用户列表的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598347/

    相关文章:

    mysql - 改进子选择查询

    Mysql - 搜索多个表

    c++ - 在 C++ 中通过 SSL 进行简单的数据库连接

    mysql - Sql 查询获取 Rails 中最受欢迎的帖子

    sql-server - 如何在不更改查询的情况下忽略查询中的参数

    sql-server - 如何在 SQL Server 中的 XML 投影中输出原始 xml,而不引入额外的 xml 根元素

    sql - T-SQL - 两个日期之间的总差

    mysql - 左外连接与子查询以包含没有员工的部门

    Mysql连接多个表错误: not unique table/alias

    mysql - SQL 查询构造 - 需要多个查询?嵌套选择?