Sql 在单行而不是两行上显示数据
您如何在图像中看到查询结果?如何将输入和输出以及时间和日期保留在一行中 选择 TR.零件,TR.描述, 日期, M1=TIO.TypeOperation=1时的情况,然后“Salio Almacen”结束, M2=TIO.TypeOperation=0时的情况,然后“Entro-Almacen”结束, 类型操作 从…起 Mant.Tool_InOut TIO 参加 手动工具\ TIO.idTools=TR.Id上的寄存器TR 哪里 castio.Date作为介于CAST@f1作为日期和CAST@f2截止日期 从这里开始:Sql 在单行而不是两行上显示数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,您如何在图像中看到查询结果?如何将输入和输出以及时间和日期保留在一行中 选择 TR.零件,TR.描述, 日期, M1=TIO.TypeOperation=1时的情况,然后“Salio Almacen”结束, M2=TIO.TypeOperation=0时的情况,然后“Entro-Almacen”结束, 类型操作 从…起 Mant.Tool_InOut TIO 参加 手动工具\ TIO.idTools=TR.Id上的寄存器TR 哪里 castio.Date作为介于CAST@f1作为日期和CAST@
SELECT
TR.Part, TR.Descripcion,
TIO.Date AS Salio_Almacen_Date,
, (SELECT TOP 1 ead.Date
FROM Mant.Tool_InOut ead
WHERE ead.idTools = TIO.idTools
AND ead.TypeOperation = 0
AND ead.Date >0 TIO.Date
) As Entro_Almacen_Date
FROM
Mant.Tool_InOut TIO
JOIN
Mant.Tool_Register TR ON TIO.idTools = TR.Id
WHERE TIO.TypeOperation = 1
AND TIO.Date >= CAST(@f1 AS date) AND TIO.Date < DATEADD(day, 1, CAST(@f2 AS date))
请注意,对于示例中的第10行和第11行(它们与其他行的顺序不一致)或第12行(它们没有匹配的TypeOperation 1记录),这将不起作用。第7行将把NULL保留在第二位,但这似乎是正确的
这里的目的是说明这一挑战。在我们给出完整的解决方案之前,您需要更好地了解数据,了解为什么首先有两行,以便告诉我们您希望如何处理这些边缘情况
最后,注意WHERE子句中日期检查的更改。避免对日期字段进行强制转换可以让您更好地利用该字段上的任何索引,这可能会对查询性能产生重大影响。我想您想知道在任何特定日期零件是否返回仓库almacen。 如果是这样的话,我想应该是这样的:
SELECT
TR.Part
, TR.Descripcion
, M1 = 'Salio'
, T1 = MIN(TS.[Date])
, M2 = 'Entro'
, T2 = CASE WHEN MAX(TE.[Date]) > MAX(TS.[Date]) THEN MAX(TE.[Date] ELSE NULL END
, TIO.TypeOperation
FROM Mant.Tool_Register TR
JOIN Mant.Tool_InOut TS ON TS.idTools = TR.Id
AND TS.TypeOperation = 1
JOIN Mant.Tool_InOut TE ON TE.idTools = TR.Id
AND TE.TypeOperation = 0
WHERE CAST(TS.Date AS date) BETWEEN CAST(@F1 AS date) AND CAST(@F2 AS date)
AND CAST(TE.Date AS date) BETWEEN CAST(@F1 AS date) AND CAST(@F2 AS date)
按照逻辑,这对我根本不起作用。 我给您原始表数据,正如您在列中所看到的,0处的值告诉我产品何时离开我的仓库,1处的值告诉我产品何时返回。
如何将其相邻放置。仅标记您真正使用的RDBMS。此外,空格和换行符对于编写任何语言都是最常用的,并且其中包括SQLDATE。成对行之间的DATE操作值是不同的。我们需要更多关于你想如何处理的信息。此外,castTIO.Date as Date表达式会影响此查询的索引使用。您应该这样做,这样仍然可以充分利用索引:TIO.Date>=CAST@f1截止日期和截止日期