Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一行中组合聚合值和非聚合值的SQL查询_Sql_Oracle - Fatal编程技术网

在一行中组合聚合值和非聚合值的SQL查询

在一行中组合聚合值和非聚合值的SQL查询,sql,oracle,Sql,Oracle,下面的查询为我提供了所需的信息,但我希望它能更进一步。在底部的表中(仅显示字段的子集),我想以一种不寻常的方式按cust_行分组(至少对我来说是不寻常的) 让我们以cust_行为2的项目为例。我想用一行而不是5行来表示这些。对于此行,我想选择除价格字段以外的所有字段,其中cust_part=“GROUPINVC”。对于“总计”字段,我希望它是“合计(总计)为新总计”,对于价格,我希望它是新总计/开票数量,其中开票数量是cust\u part=“GROUPINV”所在行上的值 我所要求的是完全荒谬

下面的查询为我提供了所需的信息,但我希望它能更进一步。在底部的表中(仅显示字段的子集),我想以一种不寻常的方式按cust_行分组(至少对我来说是不寻常的)

让我们以cust_行为2的项目为例。我想用一行而不是5行来表示这些。对于此行,我想选择除价格字段以外的所有字段,其中cust_part=“GROUPINVC”。对于“总计”字段,我希望它是“合计(总计)为新总计”,对于价格,我希望它是新总计/开票数量,其中开票数量是cust\u part=“GROUPINV”所在行上的值

我所要求的是完全荒谬的吗?有可能吗?我不擅长SQL,所以它可能也很简单,我只是不知道如何处理它。我曾想过使用“partitionby”,但我无法想象如何让它工作,因为我认为它仍然会返回5行,而我只需要1行

我也看过这些标题类似的问题,但不是我真正想要的:


可以使用分析函数计算结果集中多行的合计,然后过滤掉不需要的行

为了简洁起见,省略所有额外的列:

SELECT cust_line, qty_invoiced, order_total/qty_invoiced AS price
FROM (
  SELECT l.cust_line, qty_invoiced,
    SUM(total) OVER (PARTITION BY l.cust_line) AS order_total,
    COUNT(cust_line) OVER (PARTITION BY l.cust_line) AS group_count
  FROM
  (SELECT CUST_LINE, ORDER_NO, LINE_NO
   FROM CUSTOMER_ORDER_LINE
   GROUP BY CUST_LINE, ORDER_NO, LINE_NO
   ) L
  INNER JOIN CUSTOMER_ORDER_IVC_REP I
  ON I.ORDER_NO = L.ORDER_NO
  WHERE RESULT_KEY = 999999
  AND I.LINE_NO = L.LINE_NO
)
WHERE ( cust_part = 'GROUPINV' OR group_count = 1 )
ORDER BY cust_line
我在猜测您想要在
分区BY
子句中得到什么;这本质上是一个
分组依据
,仅适用于
求和
函数。不确定您是否也需要分区中的
order\u no


诀窍是选择内部查询中的所有行,对所有行应用求和;然后过滤掉最外层查询中不感兴趣的行。

您可以使用分析函数计算结果集中多行的合计,然后过滤掉不需要的行

为了简洁起见,省略所有额外的列:

SELECT cust_line, qty_invoiced, order_total/qty_invoiced AS price
FROM (
  SELECT l.cust_line, qty_invoiced,
    SUM(total) OVER (PARTITION BY l.cust_line) AS order_total,
    COUNT(cust_line) OVER (PARTITION BY l.cust_line) AS group_count
  FROM
  (SELECT CUST_LINE, ORDER_NO, LINE_NO
   FROM CUSTOMER_ORDER_LINE
   GROUP BY CUST_LINE, ORDER_NO, LINE_NO
   ) L
  INNER JOIN CUSTOMER_ORDER_IVC_REP I
  ON I.ORDER_NO = L.ORDER_NO
  WHERE RESULT_KEY = 999999
  AND I.LINE_NO = L.LINE_NO
)
WHERE ( cust_part = 'GROUPINV' OR group_count = 1 )
ORDER BY cust_line
我在猜测您想要在
分区BY
子句中得到什么;这本质上是一个
分组依据
,仅适用于
求和
函数。不确定您是否也需要分区中的
order\u no


诀窍是选择内部查询中的所有行,对所有行应用求和;然后在最外层的查询中筛选出您不感兴趣的行。

您的问题中没有PL/SQL我使用的是Oracle数据库,因此我认为这可能会左右答案。您为什么认为需要存储过程?PL/SQL不是“Oracle版本的SQL”,尽管许多人似乎这么认为。PL/SQL是Oracle特有的过程语言,它可以包含SQL语句。PL/SQL可以解决您的问题(尽管它不是唯一的),但您在查询中显示的只是SQL。您所使用的RDBMS很重要,这是对的。好的,我将从标题中删除PL/SQL。很抱歉给您带来困惑,谢谢您提供的信息。您的问题中没有PL/SQL。我使用的是Oracle数据库,因此我认为这可能会左右答案。为什么您认为您需要存储过程?PL/SQL不是“Oracle版本的SQL”,尽管许多人似乎这么认为。PL/SQL是Oracle特有的过程语言,它可以包含SQL语句。PL/SQL可以解决您的问题(尽管它不是唯一的),但您在查询中显示的只是SQL。您所使用的RDBMS很重要,这是对的。好的,我将从标题中删除PL/SQL。很抱歉给您带来了困惑,谢谢您提供的信息。真漂亮!工作起来很有魅力。不过我还得加上一些东西。where子句过滤掉除“grouped”行之外的所有内容,因此我在(按cust_行划分的)上添加了count(cust_行)作为group_count,然后在where子句中添加了“或group_count=1”。我不介意你为了未来观众的利益而修改你的答案来反映这一点。再次感谢!不过有件奇怪的事。当我将另一个分区添加到select语句中时,OracleSQLSDeveloper用一个橙色的斜线在它下面划了线,表示“SELECTLIST与GROUPBY不一致”,并建议我将所有未计算的项添加到GROUPBY子句中。尽管查询工作正常,但我们使用的是分区,而不是分组依据。我对OracleSQLDeveloper的语法突出显示从未有过太多的信心(这是一个只使用了一周的家伙写的)。很高兴它起到了作用。根据你的评论编辑了答案-我想我捕捉的是正确的。关于SQL开发人员,您是完全正确的;它的语法规则不完整。甚至有些关键词也无法识别。太美了!工作起来很有魅力。不过我还得加上一些东西。where子句过滤掉除“grouped”行之外的所有内容,因此我在(按cust_行划分的)上添加了count(cust_行)作为group_count,然后在where子句中添加了“或group_count=1”。我不介意你为了未来观众的利益而修改你的答案来反映这一点。再次感谢!不过有件奇怪的事。当我将另一个分区添加到select语句中时,OracleSQLSDeveloper用一个橙色的斜线在它下面划了线,表示“SELECTLIST与GROUPBY不一致”,并建议我将所有未计算的项添加到GROUPBY子句中。尽管查询工作正常,但我们使用的是分区,而不是分组依据。我对OracleSQLDeveloper的语法突出显示从未有过太多的信心(这是一个只使用了一周的家伙写的)。很高兴它起到了作用。根据你的评论编辑了答案-我想我捕捉的是正确的。关于SQL开发人员,您是完全正确的;它的语法规则不完整。甚至有些关键字也无法识别。