繁体   English   中英

使用子查询中定义的列

[英]Use column defined in a subquery

抱歉,标题不清楚,我是初学者,我不知道该如何制定...

我有这个查询使用Oracle:

SELECT

   ( SELECT COUNT(*)
     FROM   CATEGORY
   ) AS NBCATEGORIES,

   ( SELECT ROUND(AVG(FINANCIALOPERATIONBYPERSON),2)
    FROM
         (
            SELECT SUM(AMOUNT) AS FINANCIALOPERATIONBYPERSON
            FROM FINANCIALOPERATION
            WHERE PERSONID IS NOT NULL
            GROUP BY PERSONID
         )
     ) AS AVERAGELOADAMOUNTBYPERSON

FROM DUAL

我正在寻找等效的Sql Server ...

目标是在一个查询中包含多个查询。

因此,我删除了“ FROM DUAL”,但由于“ FINANCIALOPERATIONBYPERSON”(无效的列名)而出现错误,肯定是因为它是在子查询中定义的...

如何修改SQL-Server的查询?

SQL Server要求子查询使用别名。 因此,您可以将其重写为:

SELECT (SELECT COUNT(*)
        FROM   CATEGORY
       ) AS NBCATEGORIES,
       (SELECT ROUND(AVG(FINANCIALOPERATIONBYPERSON),2)
        FROM (SELECT SUM(AMOUNT) AS FINANCIALOPERATIONBYPERSON
              FROM FINANCIALOPERATION
              WHERE PERSONID IS NOT NULL
              GROUP BY PERSONID
             ) t
       ) AS AVERAGELOADAMOUNTBYPERSON;

但是,在这两个数据库中,我倾向于将其编写为:

SELECT c.NBCATEGORIES, ROUND(fo.AVERAGELOADAMOUNTBYPERSON, 2) AS AVERAGELOADAMOUNTBYPERSON
FROM (SELECT COUNT(*) as NBCATEGORIES
      FROM CATEGORY c
     ) c CROSS JOIN
     (SELECT SUM(AMOUNT) / COUNT(DISTINCT PERSONID) AS AVERAGELOADAMOUNTBYPERSON
      FROM FINANCIALOPERATION fo
      WHERE PERSONID IS NOT NULL
     ) fo;

这两种形式的一个注意事项:SQL Server对整数执行整数算术。 因此,如果AMOUNT是整数,则应将其转换为适当的浮点或定点数字类型。

您需要为子查询添加表别名。

SELECT
( SELECT COUNT(*)
     FROM   CATEGORY
   ) AS NBCATEGORIES,

   ( SELECT ROUND(AVG(RESULTS.FINANCIALOPERATIONBYPERSON),2)
    FROM
         (
            SELECT SUM(AMOUNT) AS FINANCIALOPERATIONBYPERSON
            FROM FINANCIALOPERATION
            WHERE PERSONID IS NOT NULL
            GROUP BY PERSONID
         ) RESULTS
     ) AS AVERAGELOADAMOUNTBYPERSON

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM