Skip to content

SQL

JOIN

SELECT StudentCourse.COURSE_ID, Student.NAME, Student.AGE 
FROM Student
INNER JOIN StudentCourse
ON Student.ROLL_NO = StudentCourse.ROLL_NO;
  • JOIN (or INNER JOIN)
  • LEFT JOIN (or LEFT OUTER JOIN)
  • RIGHT JOIN (or RIGHT OUTER JOIN)
  • OUTER JOIN (or fULL OUTER JOIN)


COALESCE

COALESCE is an alternative of ISNULL

SELECT COALESCE(SUM(a.spend), 0) as sales
FROM orders a
INNER JOIN dates b
ON a.dateID = b.dateID


OVER PARTITION BY

SELECT Customercity, 
       AVG(Orderamount) AS AvgOrderAmount, 
       MIN(OrderAmount) AS MinOrderAmount, 
       SUM(Orderamount) TotalOrderAmount
FROM [dbo].[Orders]
GROUP BY Customercity;


SELECT Customercity, CustomerName ,OrderAmount,
       AVG(Orderamount) AS AvgOrderAmount, 
       MIN(OrderAmount) AS MinOrderAmount, 
       SUM(Orderamount) TotalOrderAmount
FROM [dbo].[Orders]
GROUP BY Customercity;

Error: Column CustomerName is invalid in the select list because it in not contained in either an aggregare function or the GROUP BY clause.

SELECT Customercity, 
       CustomerName, 
       OrderAmount, 
       AVG(Orderamount) OVER(PARTITION BY Customercity) AS AvgOrderAmount, 
       MIN(OrderAmount) OVER(PARTITION BY Customercity) AS MinOrderAmount, 
       SUM(Orderamount) OVER(PARTITION BY Customercity) TotalOrderAmount
FROM [dbo].[Orders];


SELECT seq, week, min_date, max_date
FROM
(
    SELECT rownum seq, week, min_date, max_date
    FROM
    (
        SELECT DISTINCT week,
        MIN(dateID) OVER (PARTITION BY week) min_date,
        MAX(dateID) OVER (PARTITION BY week) max_date
        FROM dates
        WHERE week <= '202201'
        ORDER BY week DESC
    )
)
WHERE seq <= 250


SELECT col1,
SUM(col2) OVER (PARTITION BY col3, col4 ORDER BY col1) AS col22
FROM table1


SELECT seq, week, epoch, min_date, max_date
FROM
(
    SELECT rownum seq, week, epoch, min_date, max_date
    FROM
    (
        SELECT DISTINCT week, epoch,
        MIN(dateID) OVER (PARTITION BY week) min_date,
        MAX(dateID) OVER (PARTITION BY week) max_date
        FROM dates
        WHERE epoch BETWEEN
            (SELECT DISTINCT epoch FROM dates WHERE week = 202201) - 12
            AND (SELECT DISTINCT epoch FROM dates WHERE week = 202201) + 12
        ORDER BY epoch
    )
)


CASE

SELECT col1, col2,
MAX(one) 'one', MAX(two) 'two', MAX(more) 'more'
FROM
(
    SELECT col1, col2, TR,
    (CASE WHEN TR = 'one' THEN COUNT(col4) end) 'one',
    (CASE WHEN TR = 'two' THEN COUNT(col4) end) 'two',
    (CASE WHEN TR = 'more' THEN COUNT(col4) end) 'more' 
    FROM
    (
        SELECT col1, col2,
        CASE
        WHEN col3 = 1 THEN 'one'
        WHEN col3 = 2 THEN 'two'
        WHEN col3 > 2 THEN 'more'
        END 'TR'
        FROM table1
    )
    GROUP BY col1, col2, TR
)
GROUP BY col1, col2
ORDER BY col2


SELECT col1
(CASE WHEN (col1 = 0 OR col1 IS NULL) THEN 0 ELSE col1 END) AS col1
FROM table1


CAST

SELECT col1,
CAST('T99999' AS VARCHAR2(20)) AS T99999,
CAST('ALL' AS VARCHAR2(20)) ALL
FROM table1
WHERE 1 = 0


UNPIVOT

SELECT *
FROM table1
UNPIVOT
(col1 FOR col2 IN(T11111, T99999))
ORDER BY col2


SELECT a.*,
RANK() OVER (PARTITION BY col1, col2
ORDER BY col3 desc) 'col3'
FROM table a


GROUPING SETS

SELECT
    aggregate_function(column_1)
    column_2,
    column_3,
FROM
    table_name
GROUP BY
    GROUPING SETS (
        (column_2, column_3),
        (column_2),
        (column_3),
        ()
);


UNION ALL

GROUPING SETS is equivalent to UNION ALL

SELECT SUM(column_1), column_2, column_3
FROM table_name
GROUP BY
    column_2,
    column_3

UNION ALL

SELECT SUM(column_1), column_2, NULL
FROM table_name
GROUP BY column_2


ROLLUP

Similar to GROUPING SETS, you can use the ROLLUP option

SELECT
  SUM(payment_amount),
  YEAR(payment_date) AS 'Payment Year',
  store_id AS 'Store'
FROM payment
GROUP BY ROLLUP (YEAR(payment_date), store_id)
ORDER BY YEAR(payment_date), store_id


CUBE

CUBE is like combining GROUPING SETS and ROLLUP

The main difference in this output from the ROLLUP example is that the grand total for each store is also shown

SELECT
  SUM(payment_amount),
  YEAR(payment_date) AS 'Payment Year',
  store_id AS 'Store'
FROM payment
GROUP BY CUBE (YEAR(payment_date), store_id)
ORDER BY YEAR(payment_date), store_id


PL/SQL

BEGIN
    FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE '%MSTR_%')
        LOOP
        DBMS_OUTPUT.PUT_LINE(c.table_name);
        EXECUTE IMMEDIATE 'DROP TABLE' || c.table_name;
    END LOOP;
END;