当我尝试获取制造零件的 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
我有三个表:
- 01 -
ProjectInfo
:它存储有关项目的信息:
- 02 -
ProjectShipping
:它存储有关零件的信息,它有 ProjectInfoId
作为外键:
- 03 -
DailyWeldingPaintProduction
:存储日常生产信息,外键ProjectShippingId
:
但是当我 运行 它时,我得到这个错误:
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
的外部。在这种情况下,您需要修改分组。
我尝试获取按项目分组的制造零件的最小值,如下所示:
这是我的查询:
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
我有三个表:
- 01 -
ProjectInfo
:它存储有关项目的信息:
- 02 -
ProjectShipping
:它存储有关零件的信息,它有ProjectInfoId
作为外键:
- 03 -
DailyWeldingPaintProduction
:存储日常生产信息,外键ProjectShippingId
:
但是当我 运行 它时,我得到这个错误:
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 服务器:方括号中)——或者更好的是,使用不需要被引号括起来的标识符。
按照您的方式制定查询不一定是最佳解决方案。正如 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
的外部。在这种情况下,您需要修改分组。