簡體   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