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