Sql server 如何将两个查询合并为1?

Sql server 如何将两个查询合并为1?,sql-server,tsql,Sql Server,Tsql,因此,我: SELECT od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc], MAX(CAST(t.TicketDate AS DATETIME)) AS [EndDate] FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo JOIN OrderRouting r ON t.JobNo = r.JobNo WHERE t.WorkCntr =

因此,我:

SELECT
  od.PartNo,
  CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
  MAX(CAST(t.TicketDate AS DATETIME)) AS [EndDate]
FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
  JOIN OrderRouting r ON t.JobNo = r.JobNo
WHERE t.WorkCntr = 500
  AND r.Status = 'Finished'
GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
ORDER BY MIN(CAST(t.TicketDate AS DATETIME)) DESC

我需要在1个查询中包含MIN和MAX列,但因为我在WHERE子句中引用了2个不同的工作中心,所以我不确定该如何操作。我试过这个:

SELECT
  od.PartNo,
  CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
    (SELECT
       MIN(CAST(t.TicketDate AS DATETIME)) AS [StartDate]
     FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
       JOIN OrderRouting r ON t.JobNo = r.JobNo
     WHERE t.WorkCntr = 100
     GROUP BY od.PartNo
     ),
  MAX(CAST(t.TicketDate AS DATETIME)) AS [EndDate]
FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
  JOIN OrderRouting r ON t.JobNo = r.JobNo
WHERE t.WorkCntr = 500
  AND r.Status = 'Finished'
GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
ORDER BY MIN(CAST(t.TicketDate AS DATETIME)) DESC
这几乎奏效了,除了MIN列只是系统中的第一个日期,它与PartNo/Workcenter无关,所以我被卡住了。我不确定我是否接近或者我是否应该使用其他东西,比如CTE


提前感谢

如果您希望开始和结束作为单独的列,那么
大小写
表达式将允许您在更改
where
条件以允许两组行通过后选择适当的值。如果期望的开始日期总是早于最终的结束日期,就像我想象的那样,你可能根本不需要那么幻想。您确实提到在第二个结果中有更多行,所以我不确定这是从哪里来的,这可能会稍微改变逻辑

在这种情况下,主要是使用
的问题

SELECT
  od.PartNo,
  MIN(CAST(od.PartDesc AS NVARCHAR(MAX))) AS PartDesc,
  MIN(CASE WHEN t.WorkCntr  = 100 THEN CAST(t.TicketDate AS DATETIME) END)) AS StartDate,
  MAX(CASE WHEN t.WorkCntr <> 100 THEN CAST(t.TicketDate AS DATETIME) END)) AS EndDate
FROM
    TimeTicketDet t
    INNER JOIN OrderDet od ON t.JobNo = od.JobNo
    INNER JOIN OrderRouting r ON t.JobNo = r.JobNo
WHERE t.WorkCntr = 100 OR t.WorkCntr = 500 AND r.Status = 'Finished'
GROUP BY od.PartNo
ORDER BY PartDesc DESC;

因为您已经有了这两个查询,所以只需加入它们即可。如果它们没有相同数量的记录,则可以
左/右联接

SELECT *
FROM (
    SELECT
        od.PartNo,
        CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
        MAX(CAST(t.TicketDate AS DATETIME)) AS [EndDate]
    FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
    JOIN OrderRouting r ON t.JobNo = r.JobNo
    WHERE t.WorkCntr = 500 AND r.Status = 'Finished'
    GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
) a
JOIN (
    SELECT
        od.PartNo,
        CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
        MIN(CAST(t.TicketDate AS DATETIME)) AS [StartDate]
    FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
    JOIN OrderRouting r ON t.JobNo = r.JobNo
    WHERE t.WorkCntr = 100
    GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
) b ON b.PartNo = a.PartNo

你说的是联合还是某种“简化”?
union
删除重复项
union all
允许重复项我甚至没有想到联合。基本上,表1返回的是6k行,表2返回的是7k行。需要将PartNo与两个表匹配的位置合并,因此最后,我希望PartNo、PartDesc、StartDate(对于WC 100)、EndDate(对于WC 500和Status FINATED)都在1,6k行表中。如果使用case语句来决定输入MIN和MAX函数EAH的内容,则可以在一个查询中完成此操作,我想我已经在下面找到了答案。为什么在MAX(CASE())列中是100而不是=500?从技术上讲,你可以稳妥地重复第二个条件。为什么不也这样做?在我看来,这些都是显而易见的对立,尤其是当有可能涉及两个以上的代码时。因为这是整个
案例
可能是不必要的。谢谢你的帮助,工作得很好。另外,在你做得很好之前,我也很感激其他答案的附加子查询注释,但是这个答案非常不同,所以我一定会处理它。感谢you@user1452574@shawnt00的答案肯定更有效。它只使用一个
分组方式
。我基本上利用了您创建的两个查询,并加入了其中。
...
(
    SELECT MIN(CAST(t.TicketDate AS DATETIME))
    FROM OrderDet od2 INNER JOIN TimeTicketDet t
        ON t.JobNo = od2.JobNo
    WHERE t.WorkCntr = 100 AND od2.PartDesc = od.PartDesc
) AS StartDate
...
SELECT *
FROM (
    SELECT
        od.PartNo,
        CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
        MAX(CAST(t.TicketDate AS DATETIME)) AS [EndDate]
    FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
    JOIN OrderRouting r ON t.JobNo = r.JobNo
    WHERE t.WorkCntr = 500 AND r.Status = 'Finished'
    GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
) a
JOIN (
    SELECT
        od.PartNo,
        CAST(od.PartDesc AS NVARCHAR(MAX)) AS [PartDesc],
        MIN(CAST(t.TicketDate AS DATETIME)) AS [StartDate]
    FROM TimeTicketDet t JOIN OrderDet od ON t.JobNo = od.JobNo
    JOIN OrderRouting r ON t.JobNo = r.JobNo
    WHERE t.WorkCntr = 100
    GROUP BY od.PartNo, CAST(od.PartDesc AS NVARCHAR(MAX))
) b ON b.PartNo = a.PartNo