1> /* Advanced SQL Programming Fall 2002*/ 2> /* */ 3> /* Cumulative statistics - examples */ 4> /* */ 5> use pubs2 1> /* */ 2> /* Rank pubs2 titles in order of publication. */ 3> /* */ 4> select t1.title_id, t1.pubdate, 5> (select count(*) 6> from titles t2 7> where t2.pubdate < t1.pubdate) + 1 LineNum 8> from titles t1 9> order by t1.pubdate title_id pubdate LineNum -------- -------------------------- ----------- TC4203 Jun 12 1985 12:00AM 1 MC3021 Jun 18 1985 12:00AM 2 BU2075 Jun 30 1985 12:00AM 3 BU1032 Jun 12 1986 12:00AM 4 PC1035 Jun 30 1986 12:00AM 5 PC8888 Jun 12 1987 12:00AM 6 TC7777 Jun 12 1987 12:00AM 6 BU7832 Jun 22 1987 12:00AM 8 BU1111 Jun 9 1988 12:00AM 9 PS3333 Jun 12 1988 12:00AM 10 PS7777 Jun 12 1988 12:00AM 10 MC2222 Jun 9 1989 12:00AM 12 PS2091 Jun 15 1989 12:00AM 13 PS2106 Oct 5 1990 12:00AM 14 PS1372 Oct 21 1990 12:00AM 15 TC3218 Oct 21 1990 12:00AM 15 MC3026 Sep 15 1999 2:26PM 17 PC9999 Sep 15 1999 2:26PM 18 (18 rows affected) 1> /* */ 2> /* Create numbered, alphabetically sorted list of authors. */ 3> /* */ 4> select 5> (select count(*) 6> from authors a2 7> where a2.au_lname < a1.au_lname) + 1 Author#, 8> convert(char(25), rtrim(a1.au_fname + ' ' + a1.au_lname)) AuthName, 9> substring(a1.city, 1, 15) City, a1.state 10> from authors a1 11> order by a1.au_lname Author# AuthName City state ----------- ------------------------- --------------- ----- 1 Abraham Bennet Berkeley CA 2 Reginald Blotchet-Halls Corvallis OR 3 Cheryl Carson Berkeley CA 4 Michel DeFrance Gary IN 5 Ann Dull Palo Alto CA 6 Marjorie Green Oakland CA 7 Morningstar Greene Nashville TN 8 Burt Gringlesby Covelo CA 9 Sheryl Hunter Palo Alto CA 10 Livia Karsen Oakland CA 11 Chastity Locksley San Francisco CA 12 Stearns MacFeather Oakland CA 13 Heather McBadden Vacaville CA 14 Michael O'Leary San Jose CA 15 Sylvia Panteley Rockville MD 16 Anne Ringer Salt Lake City UT 16 Albert Ringer Salt Lake City UT 18 Meander Smith Lawrence KS 19 Dick Straight Oakland CA 20 Dirk Stringer Oakland CA 21 Johnson White Menlo Park CA 22 Akiko Yokomoto Walnut Creek CA 23 Innes del Castillo Ann Arbor MI (23 rows affected) 1> /* */ 2> /* As previous, but correct "same last name" problem. */ 3> /* */ 4> select 5> (select count(*) 6> from authors a2 7> where 8> a2.au_lname + a2.au_fname < a1.au_lname + a1.au_fname) + 1 Author#, 9> convert(char(25), rtrim(a1.au_fname + ' ' + a1.au_lname)) AuthName, 10> substring(a1.city, 1, 15) City, a1.state 11> from authors a1 12> order by a1.au_lname, a1.au_fname Author# AuthName City state ----------- ------------------------- --------------- ----- 1 Abraham Bennet Berkeley CA 2 Reginald Blotchet-Halls Corvallis OR 3 Cheryl Carson Berkeley CA 4 Michel DeFrance Gary IN 5 Ann Dull Palo Alto CA 6 Marjorie Green Oakland CA 7 Morningstar Greene Nashville TN 8 Burt Gringlesby Covelo CA 9 Sheryl Hunter Palo Alto CA 10 Livia Karsen Oakland CA 11 Chastity Locksley San Francisco CA 12 Stearns MacFeather Oakland CA 13 Heather McBadden Vacaville CA 14 Michael O'Leary San Jose CA 15 Sylvia Panteley Rockville MD 16 Albert Ringer Salt Lake City UT 17 Anne Ringer Salt Lake City UT 18 Meander Smith Lawrence KS 19 Dick Straight Oakland CA 20 Dirk Stringer Oakland CA 21 Johnson White Menlo Park CA 22 Akiko Yokomoto Walnut Creek CA 23 Innes del Castillo Ann Arbor MI (23 rows affected) 1> /* */ 2> /* Assign order numbers by sales date. */ 3> /* */ 4> select s1.ord_num, s1.date, 5> (select count(*) 6> from sales s2 7> where s2.date < s1.date) + 1 OrderNum 8> from sales s1 9> order by s1.date ord_num date OrderNum -------------------- -------------------------- ----------- BA27618 Oct 12 1985 12:00AM 1 AB-123-DEF-425-1Z3 Oct 31 1985 12:00AM 2 AB-872-DEF-732-2Z1 Nov 6 1985 12:00AM 3 342157 Dec 13 1985 12:00AM 4 12-F-9 Jul 13 1986 12:00AM 5 124152 Aug 14 1986 12:00AM 6 Asoap132 Nov 16 1986 12:00AM 7 BS-345-DSE-860-1F2 Dec 12 1986 12:00AM 8 NB-1.142 Jan 2 1987 12:00AM 9 GH-542-NAD-713-9F9 Mar 15 1987 12:00AM 10 NF-123-ADS-642-9G3 Jul 18 1987 12:00AM 11 Fsoap867 Sep 8 1987 12:00AM 12 234518 Sep 30 1987 12:00AM 13 BA52498 Oct 27 1987 12:00AM 14 13-J-9 Jan 13 1988 12:00AM 15 ZA-000-ASD-324-4D1 Jul 27 1988 12:00AM 16 BA71224 Aug 5 1988 12:00AM 17 13-E-7 May 23 1989 12:00AM 18 NB-3.142 Jun 13 1990 12:00AM 19 AX-532-FED-452-2Z7 Dec 1 1990 12:00AM 20 Asoap432 Dec 20 1990 12:00AM 21 234518 Feb 14 1991 12:00AM 22 356921 Feb 17 1991 12:00AM 23 55-V-7 Mar 20 1991 12:00AM 24 91-A-7 Mar 20 1991 12:00AM 24 91-V-7 Mar 20 1991 12:00AM 24 XS-135-DER-432-8J2 Mar 21 1991 12:00AM 27 ZD-123-DFG-752-9G8 Mar 21 1991 12:00AM 27 ZS-645-CAT-415-1B2 Mar 21 1991 12:00AM 27 ZZ-999-ZZZ-999-0A0 Mar 21 1991 12:00AM 27 (30 rows affected) 1> /* */ 2> /* Keep a running total of titles published: Start with */ 3> /* a ranking query (variation on first query above), and */ 4> /* use it to find max(count) for each row. */ 5> /* */ 6> select t1.title_id, datepart(yy, t1.pubdate) PubYear, 7> (select count(*) 8> from titles t2 9> where t2.pubdate < t1.pubdate) + 1 PubOrder 10> from titles t1 11> order by t1.pubdate title_id PubYear PubOrder -------- ----------- ----------- TC4203 1985 1 MC3021 1985 2 BU2075 1985 3 BU1032 1986 4 PC1035 1986 5 PC8888 1987 6 TC7777 1987 6 BU7832 1987 8 BU1111 1988 9 PS3333 1988 10 PS7777 1988 10 MC2222 1989 12 PS2091 1989 13 PS2106 1990 14 PS1372 1990 15 TC3218 1990 15 MC3026 1999 17 PC9999 1999 18 (18 rows affected) 1> /* */ 2> select t1.title_id, datepart(yy, t1.pubdate) PubYear, 3> (select count(*) 4> from titles t2 5> where t2.pubdate < t1.pubdate) + 1 PubOrder, 6> max( 7> (select count(*) 8> from titles t2 9> where t2.pubdate < t1.pubdate) +1) AllPublished 10> from titles t1 11> group by datepart(yy, t1.pubdate) 12> order by t1.pubdate title_id PubYear PubOrder AllPublished -------- ----------- ----------- ------------ TC4203 1985 1 3 MC3021 1985 2 3 BU2075 1985 3 3 BU1032 1986 4 5 PC1035 1986 5 5 PC8888 1987 6 8 TC7777 1987 6 8 BU7832 1987 8 8 BU1111 1988 9 10 PS3333 1988 10 10 PS7777 1988 10 10 MC2222 1989 12 13 PS2091 1989 13 13 PS2106 1990 14 15 PS1372 1990 15 15 TC3218 1990 15 15 MC3026 1999 17 18 PC9999 1999 18 18 (18 rows affected) 1> /* */ 2> /* As previous, but better grouping because count not shown: */ 3> /* */ 4> select datepart(yy, t1.pubdate) PubYear, 5> max( 6> (select count(*) 7> from titles t2 8> where t2.pubdate < t1.pubdate) +1 9> ) NumPublished 10> from titles t1 11> group by datepart(yy, t1.pubdate) 12> order by datepart(yy, t1.pubdate) PubYear NumPublished ----------- ------------ 1985 3 1986 5 1987 8 1988 10 1989 13 1990 15 1999 18 (7 rows affected) 1> /* */ 2> /* Keep running total, by date, of books sold. */ 3> /* */ 4> select convert(char(12), date, 101) OrderDate, s.ord_num, 5> sum(sd.qty) OrderTotal, 6> (select sum(sd2.qty) 7> from sales s2, salesdetail sd2 8> where s2.ord_num = sd2.ord_num 9> and s2.date <= s.date) RunningTotal 10> -- Using only " < " above moves RunningTotal down one row (starts NULL) 11> -- See separate query below. 12> from sales s, salesdetail sd 13> where s.ord_num = sd.ord_num 14> group by s.date, s.ord_num 15> order by s.date, s.ord_num OrderDate ord_num OrderTotal RunningTotal ------------ -------------------- ----------- ------------ 10/12/1985 BA27618 630 630 10/31/1985 AB-123-DEF-425-1Z3 6500 7130 11/06/1985 AB-872-DEF-732-2Z1 5000 12130 12/13/1985 342157 450 12580 07/13/1986 12-F-9 827 13407 08/14/1986 124152 417 13824 11/16/1986 Asoap132 517 14341 12/12/1986 BS-345-DSE-860-1F2 10400 24741 01/02/1987 NB-1.142 723 25464 03/15/1987 GH-542-NAD-713-9F9 6000 31464 07/18/1987 NF-123-ADS-642-9G3 14500 45964 09/08/1987 Fsoap867 950 46914 09/30/1987 234518 1920 48834 10/27/1987 BA52498 100 48934 01/13/1988 13-J-9 550 49484 07/27/1988 ZA-000-ASD-324-4D1 7600 57084 08/05/1988 BA71224 1700 58784 05/23/1989 13-E-7 1476 60260 06/13/1990 NB-3.142 2177 62437 12/01/1990 AX-532-FED-452-2Z7 3600 66037 12/20/1990 Asoap432 630 66667 02/14/1991 234518 1920 68587 02/17/1991 356921 825 69412 03/20/1991 55-V-7 31 70292 03/20/1991 91-A-7 409 70292 03/20/1991 91-V-7 440 70292 03/21/1991 XS-135-DER-432-8J2 8311 99366 03/21/1991 ZD-123-DFG-752-9G8 7150 99366 03/21/1991 ZS-645-CAT-415-1B2 9200 99366 03/21/1991 ZZ-999-ZZZ-999-0A0 4413 99366 (30 rows affected) 1> /* */ 2> /* Note: OK to convert dates for display, but not for the */ 3> /* comparison in the subquery: Dates don't sort correctly as */ 4> /* text. */ 5> /* */ 6> /* Start RunningTotal at second row: */ 7> /* (Using order number for sort criteria instead of date.) */ 8> /* */ 9> select sd2.ord_num, sum(sd2.qty) OrderTotal, 10> (select sum(sd.qty) 11> from sales s, salesdetail sd 12> where s.ord_num = sd.ord_num 13> and sd.ord_num < sd2.ord_num) RunningTotal 14> from salesdetail sd2 15> group by sd2.ord_num 16> order by sd2.ord_num ord_num OrderTotal RunningTotal -------------------- ----------- ------------ 12-F-9 827 NULL 124152 417 827 13-E-7 1476 1244 13-J-9 550 2720 234518 1920 3270 342157 450 7110 356921 825 7560 55-V-7 31 8385 91-A-7 409 8416 91-V-7 440 8825 AB-123-DEF-425-1Z3 6500 9265 AB-872-DEF-732-2Z1 5000 15765 AX-532-FED-452-2Z7 3600 20765 Asoap132 517 24365 Asoap432 630 24882 BA27618 630 25512 BA52498 100 26142 BA71224 1700 26242 BS-345-DSE-860-1F2 10400 27942 Fsoap867 950 38342 GH-542-NAD-713-9F9 6000 39292 NB-1.142 723 45292 NB-3.142 2177 46015 NF-123-ADS-642-9G3 14500 48192 XS-135-DER-432-8J2 8311 62692 ZA-000-ASD-324-4D1 7600 71003 ZD-123-DFG-752-9G8 7150 78603 ZS-645-CAT-415-1B2 9200 85753 ZZ-999-ZZZ-999-0A0 4413 94953 (29 rows affected) 1> /* */ 2> dump tran evelyn with truncate_only