如何在子查询中聚合案例表达式?
How to aggregate case expression within subquery?
我是堆栈溢出的新手,一直在自学 SQL 在工作中构建自定义报告。如果有人能在使用 case 表达式时指出我的平均 return 的正确方向,我将不胜感激,故事如下:
我正在尝试构建一个查询,returns 来自销售发票的定价数据。我有一份功能报告,但我正在尝试标准化定价计量单位,因为我们的成本并不总是设置为与销售价格相同的 UOM。我可以编写的代码有限,因为我使用的是允许我们只编写子查询的内部报告编写器;我没有直接访问 DBMS 的权限。
我已经在我的子查询中编写了一个 case 语句来解决 UOM 挑战,但我无法尝试汇总结果。
将 [View_QB_SalesOrderLine].[Price] 更改为 AVG([View_QB_SalesOrderLine].[Price] 后,我尝试在 Case 语句之前和之内使用 AVG 来聚合我的子查询 Case 表达式,但我尝试的所有操作都会导致查询失败。
我在下面编写的唯一代码是子查询,其他所有代码都是由报表编写器工具生成的。我非常感谢我能得到的任何帮助!
更新了导致错误的查询,而不是我试图构建的工作代码...经验教训。
如果我从 CASE 中删除 AVG,则此查询运行,但 returns 仅按 MFR、CATALOG、 和 [SPA Cost Conv] 分组的 [Price] 平均值。 有一个新的具有唯一 [SPA Cost Conv] 的项目的每个实例的行。在 Case 表达式之前使用 AVG,查询错误(错误:
对象引用未设置到对象的实例。) *此消息看起来很一般,因为它是我见过的唯一显示的消息,无论查询有什么问题。请记住,我只能在此工具中编写子查询,所有其他代码均由该工具生成。我怀疑该工具自动将子查询添加到Group By与将AVG添加到子查询时的错误有关。
对于上下文,我添加了一张我正在使用的 GUI 的图像。我在 Notepad++ 中编写自定义表达式并将它们粘贴到工具中。Report Writer
SELECT DISTINCT [Mfr] = [View_QB_SalesOrderLine].[Mfr]
,[CatalogNo] = [View_QB_SalesOrderLine].[CatalogNo]
,[SPA Cost Conv] = (AVG(CASE
WHEN [Price UOM] = [SPA Cost UOM]
THEN [SPA Cost]
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost]/100
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost]/1000
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 100
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost] / 100
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 1000
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost] * 100
END))
,[Price] = AVG([View_QB_SalesOrderLine].[Price])
,[Price UOM] = [View_QB_SalesOrderLine].[Price UOM]
FROM View_QB_SalesOrderLine
GROUP BY [View_QB_SalesOrderLine].[Mfr]
,[View_QB_SalesOrderLine].[CatalogNo]
,AVG(CASE
WHEN [Price UOM] = [SPA Cost UOM]
THEN [SPA Cost]
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost]/100
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost]/1000
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 100
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost] / 100
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 1000
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost] * 100
END)
,[View_QB_SalesOrderLine].[Price UOM]
ORDER BY [View_QB_SalesOrderLine].[Mfr] ASC
,[View_QB_SalesOrderLine].[CatalogNo] ASC
使用
Group BY
在您的代码中,根据我认为在您的情况下会售出商品的要求
您提到了子查询和外部查询,但以上内容似乎都不是其中任何一个。这让我想知道您是否需要添加关联条件。另请注意,Price
聚合不会自动添加到分组列中。所以我不确定我想知道是不是额外的括号或一些不受支持的语法导致的。
SELECT View_QB_SalesOrderLine.Mfr, View_QB_SalesOrderLine.CatalogNo,
AVG("SPA Cost UOM" *
CASE "Price UOM" + "SPA Cost UOM"
WHEN 'EM' THEN 0.001
WHEN 'EC' THEN 0.01
WHEN 'CM' THEN 0.01
WHEN 'CE' THEN 100
WHEN 'MC' THEN 100
WHEN 'ME' THEN 1000
ELSE 1
EN) AS "SPA Cost Conv",
AVG(Price) AS Price
/* , "Price UOM" -- this is not valid here */
FROM View_QB_SalesOrderLine
GROUP BY Mfr, CatalogNo
ORDER BY Mfr, CatalogNo
很久以前,我使用一个查询工具来重新组织换行符,因此在使用注释时,使用括号形式 /* */
而不是 end-of-line --
更安全。您可能想完全删除我的注释行。
我是堆栈溢出的新手,一直在自学 SQL 在工作中构建自定义报告。如果有人能在使用 case 表达式时指出我的平均 return 的正确方向,我将不胜感激,故事如下:
我正在尝试构建一个查询,returns 来自销售发票的定价数据。我有一份功能报告,但我正在尝试标准化定价计量单位,因为我们的成本并不总是设置为与销售价格相同的 UOM。我可以编写的代码有限,因为我使用的是允许我们只编写子查询的内部报告编写器;我没有直接访问 DBMS 的权限。
我已经在我的子查询中编写了一个 case 语句来解决 UOM 挑战,但我无法尝试汇总结果。
将 [View_QB_SalesOrderLine].[Price] 更改为 AVG([View_QB_SalesOrderLine].[Price] 后,我尝试在 Case 语句之前和之内使用 AVG 来聚合我的子查询 Case 表达式,但我尝试的所有操作都会导致查询失败。
我在下面编写的唯一代码是子查询,其他所有代码都是由报表编写器工具生成的。我非常感谢我能得到的任何帮助!
更新了导致错误的查询,而不是我试图构建的工作代码...经验教训。 如果我从 CASE 中删除 AVG,则此查询运行,但 returns 仅按 MFR、CATALOG、 和 [SPA Cost Conv] 分组的 [Price] 平均值。 有一个新的具有唯一 [SPA Cost Conv] 的项目的每个实例的行。在 Case 表达式之前使用 AVG,查询错误(错误: 对象引用未设置到对象的实例。) *此消息看起来很一般,因为它是我见过的唯一显示的消息,无论查询有什么问题。请记住,我只能在此工具中编写子查询,所有其他代码均由该工具生成。我怀疑该工具自动将子查询添加到Group By与将AVG添加到子查询时的错误有关。
对于上下文,我添加了一张我正在使用的 GUI 的图像。我在 Notepad++ 中编写自定义表达式并将它们粘贴到工具中。Report Writer
SELECT DISTINCT [Mfr] = [View_QB_SalesOrderLine].[Mfr]
,[CatalogNo] = [View_QB_SalesOrderLine].[CatalogNo]
,[SPA Cost Conv] = (AVG(CASE
WHEN [Price UOM] = [SPA Cost UOM]
THEN [SPA Cost]
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost]/100
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost]/1000
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 100
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost] / 100
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 1000
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost] * 100
END))
,[Price] = AVG([View_QB_SalesOrderLine].[Price])
,[Price UOM] = [View_QB_SalesOrderLine].[Price UOM]
FROM View_QB_SalesOrderLine
GROUP BY [View_QB_SalesOrderLine].[Mfr]
,[View_QB_SalesOrderLine].[CatalogNo]
,AVG(CASE
WHEN [Price UOM] = [SPA Cost UOM]
THEN [SPA Cost]
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost]/100
WHEN [Price UOM] = 'E' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost]/1000
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 100
WHEN [Price UOM] = 'C' AND [SPA Cost UOM] = 'M'
THEN [SPA Cost] / 100
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'E'
THEN [SPA Cost] * 1000
WHEN [Price UOM] = 'M' AND [SPA Cost UOM] = 'C'
THEN [SPA Cost] * 100
END)
,[View_QB_SalesOrderLine].[Price UOM]
ORDER BY [View_QB_SalesOrderLine].[Mfr] ASC
,[View_QB_SalesOrderLine].[CatalogNo] ASC
使用
Group BY
在您的代码中,根据我认为在您的情况下会售出商品的要求
您提到了子查询和外部查询,但以上内容似乎都不是其中任何一个。这让我想知道您是否需要添加关联条件。另请注意,Price
聚合不会自动添加到分组列中。所以我不确定我想知道是不是额外的括号或一些不受支持的语法导致的。
SELECT View_QB_SalesOrderLine.Mfr, View_QB_SalesOrderLine.CatalogNo,
AVG("SPA Cost UOM" *
CASE "Price UOM" + "SPA Cost UOM"
WHEN 'EM' THEN 0.001
WHEN 'EC' THEN 0.01
WHEN 'CM' THEN 0.01
WHEN 'CE' THEN 100
WHEN 'MC' THEN 100
WHEN 'ME' THEN 1000
ELSE 1
EN) AS "SPA Cost Conv",
AVG(Price) AS Price
/* , "Price UOM" -- this is not valid here */
FROM View_QB_SalesOrderLine
GROUP BY Mfr, CatalogNo
ORDER BY Mfr, CatalogNo
很久以前,我使用一个查询工具来重新组织换行符,因此在使用注释时,使用括号形式 /* */
而不是 end-of-line --
更安全。您可能想完全删除我的注释行。