[英]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.