Select 列的最大值
Select max value of a column
我有一个根据某些条件选择某些字段的查询:
SELECT [Qty].[plant_no]
,[Qty].[ord_no]
,[Qty].[form_no]
,[Qty].[form_var]
,[Qty].[form_part]
,[Qty].[res_no]
,isnull([RFORMPARTS].[cost_center],'_') as [RFORMPARTS_cost_center]
,[BARTICLES].[wght_net] AS [Unit_kg]
,CASE
WHEN [Qty].[qty_unit] IN ('KG','KG-C') THEN [Qty].[fb_qty]
WHEN [Qty].[qty_unit] = 'NR' THEN [Qty].[fb_qty]*[BARTICLES].[wght_net]
END AS [Qty_KG]
FROM [dbo].[E00_PRD_003] AS [Qty]
LEFT JOIN [dbo].[RFORMPARTS] as [RFORMPARTS] ON [RFORMPARTS].[form_no] = [Qty].[form_no] AND [RFORMPARTS].[form_var] = [Qty].[form_var] and [RFORMPARTS].[form_part] = [qty].form_part
LEFT JOIN [dbo].[BARTICLES] AS [BARTICLES] ON [BARTICLES].[art_no] = [Qty].[form_no]
WHERE CONVERT(VARCHAR(10),[Qty].[date_start],112) >= 20180101 AND [Qty].[in_out] = '02' AND LEFT([Qty].[res_no],2) <> 'SL'
我想获得每个 [Qty].[ord_no] 和 [Qty].[form_no] 的最大值 Qty.form_part,同时保留所有选定的字段。是否可以通过分组来做到这一点?如果是,我该怎么做?如果没有,还有其他方法吗?
如果我理解您的要求,一种选择是创建一个子查询,其中 returns 每个 ord_no
和 form_no
对的 max
,您将使用Group By
但它只会在子查询中,然后你会在你的外部查询结果中使用子查询的 max
form_part
值,如果你只想要具有每个最大值的行ord_no
& form_no
对,您将向子查询的 INNER JOIN
添加一个条件,添加 form_part
值的连接,以便它连接最大值为好吧,这将过滤掉所有具有相同 ord_no
和 form_no
组合且小于最大 form_part
值的额外行:
SELECT [Qty].[plant_no]
,[Qty].[ord_no]
,[Qty].[form_no]
,[Qty].[form_var]
--,[Qty].[form_part] --Replaced with the subquery max
,[maxVals].[form_part] --Max values returned by subquery
,[Qty].[res_no]
,isnull([RFORMPARTS].[cost_center],'_') as [RFORMPARTS_cost_center]
,[BARTICLES].[wght_net] AS [Unit_kg]
,CASE
WHEN [Qty].[qty_unit] IN ('KG','KG-C') THEN [Qty].[fb_qty]
WHEN [Qty].[qty_unit] = 'NR' THEN [Qty].[fb_qty]*[BARTICLES].[wght_net]
END AS [Qty_KG]
FROM [dbo].[E00_PRD_003] AS [Qty]
INNER JOIN --INNER JOIN the max values on the Qty table
(
SELECT [ord_no], [form_no], MAX([form_part]) AS [form_part]
FROM [dbo].[E00_PRD_003]
GROUP BY [ord_no], [form_no]
) AS maxVals
ON [maxVals].[ord_no] = [Qty].[ord_no] AND [maxVals].[form_no] = [Qty].[form_no]
AND [maxVals].[form_part] = [Qty].[form_part]
LEFT JOIN [dbo].[RFORMPARTS] as [RFORMPARTS] ON [RFORMPARTS].[form_no] = [Qty].[form_no] AND [RFORMPARTS].[form_var] = [Qty].[form_var] and [RFORMPARTS].[form_part] = [qty].form_part
LEFT JOIN [dbo].[BARTICLES] AS [BARTICLES] ON [BARTICLES].[art_no] = [Qty].[form_no]
WHERE CONVERT(VARCHAR(10),[Qty].[date_start],112) >= 20180101 AND [Qty].[in_out] = '02' AND LEFT([Qty].[res_no],2) <> 'SL'
我有一个根据某些条件选择某些字段的查询:
SELECT [Qty].[plant_no]
,[Qty].[ord_no]
,[Qty].[form_no]
,[Qty].[form_var]
,[Qty].[form_part]
,[Qty].[res_no]
,isnull([RFORMPARTS].[cost_center],'_') as [RFORMPARTS_cost_center]
,[BARTICLES].[wght_net] AS [Unit_kg]
,CASE
WHEN [Qty].[qty_unit] IN ('KG','KG-C') THEN [Qty].[fb_qty]
WHEN [Qty].[qty_unit] = 'NR' THEN [Qty].[fb_qty]*[BARTICLES].[wght_net]
END AS [Qty_KG]
FROM [dbo].[E00_PRD_003] AS [Qty]
LEFT JOIN [dbo].[RFORMPARTS] as [RFORMPARTS] ON [RFORMPARTS].[form_no] = [Qty].[form_no] AND [RFORMPARTS].[form_var] = [Qty].[form_var] and [RFORMPARTS].[form_part] = [qty].form_part
LEFT JOIN [dbo].[BARTICLES] AS [BARTICLES] ON [BARTICLES].[art_no] = [Qty].[form_no]
WHERE CONVERT(VARCHAR(10),[Qty].[date_start],112) >= 20180101 AND [Qty].[in_out] = '02' AND LEFT([Qty].[res_no],2) <> 'SL'
我想获得每个 [Qty].[ord_no] 和 [Qty].[form_no] 的最大值 Qty.form_part,同时保留所有选定的字段。是否可以通过分组来做到这一点?如果是,我该怎么做?如果没有,还有其他方法吗?
如果我理解您的要求,一种选择是创建一个子查询,其中 returns 每个 ord_no
和 form_no
对的 max
,您将使用Group By
但它只会在子查询中,然后你会在你的外部查询结果中使用子查询的 max
form_part
值,如果你只想要具有每个最大值的行ord_no
& form_no
对,您将向子查询的 INNER JOIN
添加一个条件,添加 form_part
值的连接,以便它连接最大值为好吧,这将过滤掉所有具有相同 ord_no
和 form_no
组合且小于最大 form_part
值的额外行:
SELECT [Qty].[plant_no]
,[Qty].[ord_no]
,[Qty].[form_no]
,[Qty].[form_var]
--,[Qty].[form_part] --Replaced with the subquery max
,[maxVals].[form_part] --Max values returned by subquery
,[Qty].[res_no]
,isnull([RFORMPARTS].[cost_center],'_') as [RFORMPARTS_cost_center]
,[BARTICLES].[wght_net] AS [Unit_kg]
,CASE
WHEN [Qty].[qty_unit] IN ('KG','KG-C') THEN [Qty].[fb_qty]
WHEN [Qty].[qty_unit] = 'NR' THEN [Qty].[fb_qty]*[BARTICLES].[wght_net]
END AS [Qty_KG]
FROM [dbo].[E00_PRD_003] AS [Qty]
INNER JOIN --INNER JOIN the max values on the Qty table
(
SELECT [ord_no], [form_no], MAX([form_part]) AS [form_part]
FROM [dbo].[E00_PRD_003]
GROUP BY [ord_no], [form_no]
) AS maxVals
ON [maxVals].[ord_no] = [Qty].[ord_no] AND [maxVals].[form_no] = [Qty].[form_no]
AND [maxVals].[form_part] = [Qty].[form_part]
LEFT JOIN [dbo].[RFORMPARTS] as [RFORMPARTS] ON [RFORMPARTS].[form_no] = [Qty].[form_no] AND [RFORMPARTS].[form_var] = [Qty].[form_var] and [RFORMPARTS].[form_part] = [qty].form_part
LEFT JOIN [dbo].[BARTICLES] AS [BARTICLES] ON [BARTICLES].[art_no] = [Qty].[form_no]
WHERE CONVERT(VARCHAR(10),[Qty].[date_start],112) >= 20180101 AND [Qty].[in_out] = '02' AND LEFT([Qty].[res_no],2) <> 'SL'