当我尝试获取制造零件的 MIN 值时,我得到(只有一个表达式......当 EXISTS 未引入子查询时)

When I try to get MIN value of manufactured parts I get (Only one expression ... when the subquery is not introduced with EXISTS)

我尝试获取按项目分组的制造零件的最小值,如下所示:

这是我的查询:

SELECT 
   proinfo.ProjectN 
  ,ProjShipp.[Parts] 
  ,ProjShipp.Qty AS 'Qty Total'
  ,Sum(DailyProduction.Quantity) AS 'Qty Manufactured'

  ,(SELECT  DailySumPoteau.IdProject, MIN(DailySumPoteau.DailySum) 
   FROM  (SELECT PShipp.IdProject,  SUM(DailyWelding.Quantity) DailySum  
          FROM   DailyWeldingPaintProduction DailyWelding 
          INNER JOIN ProjectShipping  PShipp ON PShipp.id=DailyWelding.FK_idPartShip  
          WHERE PShipp.id=ProjShipp.id 
          GROUP BY PShipp.id,PShipp.IdProject)DailySumPoteau  
    GROUP BY DailySumPoteau.IdProject ) AS 'Qt Pole'

 FROM [dbo].[DailyWeldingPaintProduction]  DailyProduction
 INNER join ProjectShipping ProjShipp on ProjShipp.id=DailyProduction.FK_idPartShip
 inner join ProjectInfo proinfo on proinfo.id=IdProject

  GROUP By proinfo.id
  ,proinfo.ProjectN 
  ,ProjShipp.[Parts] 
  ,ProjShipp.Qty
  ,ProjShipp.[Designation] 
  ,ProjShipp.id

我有三个表:

但是当我 运行 它时,我得到这个错误:

Msg 116, Level 16, State 1, Line 13
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

我该如何解决这个问题?

根据您的目标结果,我怀疑您想要windowMIN()假设您的查询有效并在删除子查询时生成正确的结果(QtPole 列分开),那将是:

SELECT pi.ProjectN, ps.[Parts], ps.Qty AS QtyTotal,
    SUM(dp.Quantity) AS QtyManufactured,
    MIN(SUM(dp.Quantity)) OVER(PARTITION BY pi.ProjectN) AS QtPole
    ps.Designation
FROM [dbo].[DailyWeldingPaintProduction]  dp
INNER join ProjectShipping ps on ps.id=dp.FK_idPartShip
INNER join ProjectInfo pi on pi.id=IdProject
GROUP BY pi.id, pi.ProjectN, ps.[Parts], ps.Qty, ps.Designation, ps.id

旁注:不要对标识符使用单引号;它们应该只保留给文字字符串。为您的数据库使用正确的引号字符(在 SQL 服务器:方括号中)——或者更好的是,使用不需要被引号括起来的标识符。

按照您的方式制定查询不一定是最佳解决方案。正如 提到的,在这种情况下最好的方法可能是使用 window 函数/OVER。但是因为这可以依赖于索引,也可以理解哪里出了问题,我会告诉你修复原始查询的方法。

您的查询的问题是它在 SELECT 中有一个相关的子查询,其中 returns 两个值。您尝试做的事情可以在支持行构造函数的 RDBMS 中完成,不幸的是 SQl 服务器不是其中之一。

你在这里想要得到的是 table 的每行得到一个完整的结果集。 查询的正确语法是 APPLY 每一行的子查询的结果集。在这种情况下,您可以 CROSS APPLY,因为由于相关性,无论如何您都可以保证得到结果:

SELECT 
   proinfo.ProjectN 
  ,ProjShipp.[Parts] 
  ,ProjShipp.Qty AS 'Qty Total'
  ,Sum(DailyProduction.Quantity) AS 'Qty Manufactured'
  ,QtPole.IdProject
  ,QtPole.MinDailySum

 FROM [dbo].[DailyWeldingPaintProduction]  DailyProduction
 INNER join ProjectShipping ProjShipp on ProjShipp.id=DailyProduction.FK_idPartShip
 inner join ProjectInfo proinfo on proinfo.id=ProjShipp.IdProject

 CROSS APPLY (
     SELECT  DailySumPoteau.IdProject, MIN(DailySumPoteau.DailySum) MinDailySum
       FROM  (SELECT DailyWelding.FK_idPartShip IdProject,  SUM(DailyWelding.Quantity) DailySum  
          FROM   DailyWeldingPaintProduction DailyWelding 
          WHERE DailyWelding.FK_idPartShip=ProjShipp.id 
          GROUP BY DailyWelding.FK_idPartShip) DailySumPoteau  
      GROUP BY DailySumPoteau.IdProject
  ) AS QtPole

  GROUP By proinfo.id
  ,proinfo.ProjectN 
  ,ProjShipp.[Parts] 
  ,ProjShipp.Qty
  ,ProjShipp.[Designation] 
  ,ProjShipp.id
  ,QtPole.IdProject
  ,QtPole.MinDailySum

我冒昧地通过删除不必要的 ProjectShipping 引用来清理子查询。请注意,此处添加分组列并不重要,因为与 ProjShipp.Id

相关

另请注意,根据索引和密度等,将子查询表述为 JOIN 可能更好,相关性位于 ON 的外部。在这种情况下,您需要修改分组。