简体   繁体   English

使用子查询中定义的列

[英]Use column defined in a subquery

Sorry if the title is not clear, I'm a beginner and I didn't know exactly how to formule it... 抱歉,标题不清楚,我是初学者,我不知道该如何制定...

I have this query working with Oracle : 我有这个查询使用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

I'm looking for the equivalent for Sql Server... 我正在寻找等效的Sql Server ...

The goal is to have multiple queries in a single query. 目标是在一个查询中包含多个查询。

So I removed the "FROM DUAL" but I get an error on "FINANCIALOPERATIONBYPERSON" (Invalid column name), certainly because it's defined in the subquery... 因此,我删除了“ FROM DUAL”,但由于“ FINANCIALOPERATIONBYPERSON”(无效的列名)而出现错误,肯定是因为它是在子查询中定义的...

How can I modify the query for SQL-Server ? 如何修改SQL-Server的查询?

SQL Server requires aliases for subqueries. SQL Server要求子查询使用别名。 So, you can rewrite this as: 因此,您可以将其重写为:

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;

In both databases, though, I would be inclined to write this as: 但是,在这两个数据库中,我倾向于将其编写为:

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;

One note for both these forms: SQL Server does integer arithmetic on integers. 这两种形式的一个注意事项:SQL Server对整数执行整数算术。 So, if AMOUNT is an integer, then you should convert it to an appropriate floating or fixed point numeric type. 因此,如果AMOUNT是整数,则应将其转换为适当的浮点或定点数字类型。

You need to add a table alias for the subquery. 您需要为子查询添加表别名。

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