2010-10-26 12 views
10

jestem po prostu staramy się uprościć Select:SQL: Za pomocą aliasu kolumny w funkcji w tym samym select

Select (a+b+c)/3 AS V, MIN((a+b+c)/3) as Min, MAX((a+b+c)/3) as Max from .... 

istnieje czysty sposób, aby uniknąć powtarzania tej formuły (a + b + c)/3 w funkcjach zagregowanych?

+0

Należy pamiętać, że pierwsze wybrane wyrażenie będzie losowe (np. ng mysql i bez grupy przez) – Unreason

Odpowiedz

10
SELECT 
    Result/3 AS V, 
    MIN(Result/3) as Min, 
    MAX(Result/3) as Max 
FROM 
(
    SELECT (a+b+c) AS Result from Table 
) AS outerTable 

lub nawet

SELECT 
    Result AS V, 
    MIN(Result) as Min, 
    MAX(Result) as Max 
FROM 
(
    SELECT (a+b+c)/3 AS Result from Table 
) AS outerTable 
+0

+1, ale może być może uprościć to jeszcze bardziej, wykonując podział w wewnętrznej selekcji. –

+3

Zastanawiam się, czy przyszły standard SQL może obsługiwać ** używać aliasu na tej samej liście, aby uniknąć zapytania dodatkowego ** –

1

Jeśli potrzebujesz wartość (a+b+c)/3 w więcej niż tylko jednym zapytaniu SQL i twój dialekt obsługuje widoki, warto rozważyć użycie View.

Poniższy kod może być użyty w MySQL do utworzenia widoku, który zawiera wszystkie kolumny tabeli MY_TABLE_NAME + dodatkową kolumnę zawierającą wartość (a+b+c)/3.

CREATE ALGORITHM = UNDEFINED 
SQL SECURITY DEFINER VIEW `MY_TABLE_NAME_FULL_VIEW` AS 
SELECT MY_TABLE_NAME.*, (a+b+c)/3 AS Average 
    FROM `MY_TABLE_NAME`; 

Następujący kod może być użyty w celu utworzenia MySQL widok zawierający tylko kolumn A, B i C + dodatkowa kolumna zawierająca wartości (a+b+c)/3.

CREATE ALGORITHM = UNDEFINED 
SQL SECURITY DEFINER VIEW `MY_TABLE_NAME_LIMITED_VIEW` AS 
SELECT a, b, c, (a+b+c)/3 AS Average 
    FROM `MY_TABLE_NAME`; 

Poniższy kod może być użyty w MySQL utworzyć widok w MySQL, który zawiera jedynie wartość (a+b+c)/3.

CREATE ALGORITHM = UNDEFINED 
SQL SECURITY DEFINER VIEW `MY_TABLE_NAME_AVERAGE_VIEW` AS 
SELECT (a+b+c)/3 AS Average 
    FROM `MY_TABLE_NAME`; 

Po utworzeniu widoku użyj widoku zamiast tabeli w zapytaniach wybranych.


Zakładając utworzony widok MY_TABLE_NAME_AVERAGE_VIEW, można zastąpić oświadczenie SELECT z tym:

SELECT Average AS V, MIN(Average) AS Min, MAX(Average) AS Max 
FROM MY_TABLE_NAME_AVERAGE_VIEW; 

Zakładając utworzony widok MY_TABLE_NAME_LIMITED_VIEW, a także muszą zawierać wartości A, B i C, można Zamień swój numer SELECT na następujący:

SELECT a, b, c, Average AS V, MIN(Average) AS Min, MAX(Average) AS Max 
FROM MY_TABLE_NAME_LIMITED_VIEW; 
Powiązane problemy