In SQL you can easily define an alias for a table or column and just as easily for a query or subquery. This can be useful when joining two datasets (SQL ANSI-92 standard):
SELECT *
FROM (SELECT column1, column2
    FROM table1
    [WHERE]) query1
JOIN (SELECT column1, column3
    FROM table2
    [WHERE]) query2
ON query1.column1=query2.column1
but it's especially useful when you need to reuse a query mutliple times. To do so, you can declare it using the WITH clause (SQL-99 standard) before you query:
--query to be reused
WITH myquery AS (
    SELECT column1,..., columnN
    FROM table1 [can even JOIN]
    [WHERE] 
)
--your query
SELECT q.column1,
    COUNT(q.column1) as total,
--here we reuse myquery but filter it more deeply 
    (SELECT COUNT(q1.column1)
        FROM myquery q1
        WHERE q1.columnN='value'
--this is necessary otherwise the GROUP BY will not work 
        AND q1.column1=q.column1) as totalValue
FROM myquery q [can even JOIN]
GROUP BY q.column1
ORDERBY q.column1 ASC;
Here we declared a query myquery producing a dataset with column1,...,columnN columns then selected (by grouping for column1), how many records where present (total) and of those, how many with columnN='value' (totalValue).
Remember that you cannot COUNT(SELECT ...) and that this would have been wrong:
WITH myquery AS (
    SELECT column1,..., columnN
    FROM table1 [can even JOIN]
    [WHERE] 
)
SELECT q.column1,
    COUNT(q.column1) as total,
    (SELECT COUNT(q.column1)
        FROM q
        WHERE q.columnN='value') as totalValue
FROM myquery q [can even JOIN]
GROUP BY q.column1
ORDERBY q.column1 ASC;
as you cannot reuse the q alias declared in the outer FROM inside that subquery.
 
No comments:
Post a Comment
With great power comes great responsibility