SQL Server/T-SQL/Analytical Functions/COMPUTE — различия между версиями

Материал из SQL эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 10:20, 26 мая 2010

COMPUTE: calculate summary values that appear as additional rows in the result of a query

11>
12> CREATE TABLE works_on       (emp_no       INTEGER NOT NULL,
13>                         project_no    CHAR(4) NOT NULL,
14>                         job CHAR (15) NULL,
15>                         enter_date    DATETIME NULL)
16>
17> insert into works_on values (1, "p1", "analyst", "1997.10.1")
18> insert into works_on values (1, "p3", "manager", "1999.1.1")
19> insert into works_on values (2, "p2", "clerk",   "1998.2.15")
20> insert into works_on values (2, "p2",  NULL,     "1998.6.1")
21> insert into works_on values (3, "p2",  NULL,     "1997.12.15")
22> insert into works_on values (4, "p3", "analyst", "1998.10.15")
23> insert into works_on values (5, "p1", "manager", "1998.4.15")
24> insert into works_on values (6, "p1",  NULL,     "1998.8.1")
25> insert into works_on values (7, "p2", "clerk",   "1999.2.1")
26> insert into works_on values (8, "p3", "clerk",   "1997.11.15")
27> insert into works_on values (7, "p1", "clerk",   "1998.1.4")
28> -- COMPUTE clause uses aggregate functions (MIN, MAX, SUM, AVG, and COUNT) to 
calculate summary values that appear as additional rows in the result of a query.
29>
30> SELECT emp_no, project_no, enter_date
31> FROM works_on
32> WHERE project_no = "p1" OR project_no = "p2"
33> COMPUTE MIN(enter_date)
34> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
emp_no      project_no enter_date
----------- ---------- -----------------------
          1 p1         1997-10-01 00:00:00.000
          2 p2         1998-02-15 00:00:00.000
          2 p2         1998-06-01 00:00:00.000
          3 p2         1997-12-15 00:00:00.000
          5 p1         1998-04-15 00:00:00.000
          6 p1         1998-08-01 00:00:00.000
          7 p2         1999-02-01 00:00:00.000
          7 p1         1998-01-04 00:00:00.000
                       min
                       =======================
                       1997-10-01 00:00:00.000
1>
2> drop table works_on
3> GO



COMPUTE MIN date

12>
13> CREATE TABLE works_on       (emp_no       INTEGER NOT NULL,
14>                         project_no    CHAR(4) NOT NULL,
15>                         job CHAR (15) NULL,
16>                         enter_date    DATETIME NULL)
17>
18> insert into works_on values (1, "p1", "analyst", "1997.10.1")
19> insert into works_on values (1, "p3", "manager", "1999.1.1")
20> insert into works_on values (2, "p2", "clerk",   "1998.2.15")
21> insert into works_on values (2, "p2",  NULL,     "1998.6.1")
22> insert into works_on values (3, "p2",  NULL,     "1997.12.15")
23> insert into works_on values (4, "p3", "analyst", "1998.10.15")
24> insert into works_on values (5, "p1", "manager", "1998.4.15")
25> insert into works_on values (6, "p1",  NULL,     "1998.8.1")
26> insert into works_on values (7, "p2", "clerk",   "1999.2.1")
27> insert into works_on values (8, "p3", "clerk",   "1997.11.15")
28> insert into works_on values (7, "p1", "clerk",   "1998.1.4")
29>
30> select * from works_on
31> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
emp_no      project_no job             enter_date
----------- ---------- --------------- -----------------------
          1 p1         analyst         1997-10-01 00:00:00.000
          1 p3         manager         1999-01-01 00:00:00.000
          2 p2         clerk           1998-02-15 00:00:00.000
          2 p2         NULL            1998-06-01 00:00:00.000
          3 p2         NULL            1997-12-15 00:00:00.000
          4 p3         analyst         1998-10-15 00:00:00.000
          5 p1         manager         1998-04-15 00:00:00.000
          6 p1         NULL            1998-08-01 00:00:00.000
          7 p2         clerk           1999-02-01 00:00:00.000
          8 p3         clerk           1997-11-15 00:00:00.000
          7 p1         clerk           1998-01-04 00:00:00.000
(11 rows affected)
1>
2>
3> SELECT emp_no, project_no, enter_date
4>        FROM works_on
5>        WHERE project_no = "p1" OR project_no = "p2"
6>        ORDER BY project_no
7>       COMPUTE MIN(enter_date) BY project_no
8> GO
emp_no      project_no enter_date
----------- ---------- -----------------------
          1 p1         1997-10-01 00:00:00.000
          5 p1         1998-04-15 00:00:00.000
          6 p1         1998-08-01 00:00:00.000
          7 p1         1998-01-04 00:00:00.000
                       min
                       -----------------------
                       1997-10-01 00:00:00.000
emp_no      project_no enter_date
----------- ---------- -----------------------
          7 p2         1999-02-01 00:00:00.000
          2 p2         1998-02-15 00:00:00.000
          2 p2         1998-06-01 00:00:00.000
          3 p2         1997-12-15 00:00:00.000
                       min
                       -----------------------
                       1997-12-15 00:00:00.000
1>
2> drop table works_on
3> GO
1>



COMPUTE SUM(Salary)

1> create table employee(
2>     ID          int,
3>     name        nvarchar (10),
4>     salary      int,
5>     start_date  datetime,
6>     city        nvarchar (10),
7>     region      char (1))
8> GO
1>
2> insert into employee (ID, name,    salary, start_date, city,       region)
3>               values (1,  "Jason", 40420,  "02/01/94", "New York", "W")
4> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (2,  "Robert",14420,  "01/02/95", "Vancouver","N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (3,  "Celia", 24020,  "12/03/96", "Toronto",  "W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (4,  "Linda", 40620,  "11/04/97", "New York", "N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (5,  "David", 80026,  "10/05/98", "Vancouver","W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (6,  "James", 70060,  "09/06/99", "Toronto",  "N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (7,  "Alison",90620,  "08/07/00", "New York", "W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (8,  "Chris", 26020,  "07/08/01", "Vancouver","N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (9,  "Mary",  60020,  "06/09/02", "Toronto",  "W")
3> GO
(1 rows affected)
1>
2> select * from employee
3> GO
ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          1 Jason            40420 1994-02-01 00:00:00.000 New York   W
          2 Robert           14420 1995-01-02 00:00:00.000 Vancouver  N
          3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W
          4 Linda            40620 1997-11-04 00:00:00.000 New York   N
          5 David            80026 1998-10-05 00:00:00.000 Vancouver  W
          6 James            70060 1999-09-06 00:00:00.000 Toronto    N
          7 Alison           90620 2000-08-07 00:00:00.000 New York   W
          8 Chris            26020 2001-07-08 00:00:00.000 Vancouver  N
          9 Mary             60020 2002-06-09 00:00:00.000 Toronto    W
(9 rows affected)
1>
2> -- COMPUTE BY
3>
4> SELECT salary, Name
5> FROM Employee
6> ORDER BY ID, Name
7> COMPUTE SUM(Salary)
8> GO
salary      Name
----------- ----------
      40420 Jason
      14420 Robert
      24020 Celia
      40620 Linda
      80026 David
      70060 James
      90620 Alison
      26020 Chris
      60020 Mary
sum
===========
     446226
1>
2> drop table employee
3> GO
1>



COMPUTE SUM(Salary) By Name

1> create table employee(
2>     ID          int,
3>     name        nvarchar (10),
4>     salary      int,
5>     start_date  datetime,
6>     city        nvarchar (10),
7>     region      char (1))
8> GO
1>
2> insert into employee (ID, name,    salary, start_date, city,       region)
3>               values (1,  "Jason", 40420,  "02/01/94", "New York", "W")
4> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (2,  "Robert",14420,  "01/02/95", "Vancouver","N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (3,  "Celia", 24020,  "12/03/96", "Toronto",  "W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (4,  "Linda", 40620,  "11/04/97", "New York", "N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (5,  "David", 80026,  "10/05/98", "Vancouver","W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (6,  "James", 70060,  "09/06/99", "Toronto",  "N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (7,  "Alison",90620,  "08/07/00", "New York", "W")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (8,  "Chris", 26020,  "07/08/01", "Vancouver","N")
3> GO
(1 rows affected)
1> insert into employee (ID, name,    salary, start_date, city,       region)
2>               values (9,  "Mary",  60020,  "06/09/02", "Toronto",  "W")
3> GO
(1 rows affected)
1>
2> select * from employee
3> GO
ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          1 Jason            40420 1994-02-01 00:00:00.000 New York   W
          2 Robert           14420 1995-01-02 00:00:00.000 Vancouver  N
          3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W
          4 Linda            40620 1997-11-04 00:00:00.000 New York   N
          5 David            80026 1998-10-05 00:00:00.000 Vancouver  W
          6 James            70060 1999-09-06 00:00:00.000 Toronto    N
          7 Alison           90620 2000-08-07 00:00:00.000 New York   W
          8 Chris            26020 2001-07-08 00:00:00.000 Vancouver  N
          9 Mary             60020 2002-06-09 00:00:00.000 Toronto    W
(9 rows affected)
1>
2> SELECT ID, Name, City, Salary
3> FROM Employee
4> WHERE ID > 2
5> ORDER BY Name, City
6> COMPUTE SUM(Salary) By Name
7> GO
ID          Name       City       Salary
----------- ---------- ---------- -----------
          7 Alison     New York         90620
                                  sum
                                  -----------
                                        90620
ID          Name       City       Salary
----------- ---------- ---------- -----------
          3 Celia      Toronto          24020
                                  sum
                                  -----------
                                        24020
ID          Name       City       Salary
----------- ---------- ---------- -----------
          8 Chris      Vancouver        26020
                                  sum
                                  -----------
                                        26020
ID          Name       City       Salary
----------- ---------- ---------- -----------
          5 David      Vancouver        80026
                                  sum
                                  -----------
                                        80026
ID          Name       City       Salary
----------- ---------- ---------- -----------
          6 James      Toronto          70060
                                  sum
                                  -----------
                                        70060
ID          Name       City       Salary
----------- ---------- ---------- -----------
          4 Linda      New York         40620
                                  sum
                                  -----------
                                        40620
ID          Name       City       Salary
----------- ---------- ---------- -----------
          9 Mary       Toronto          60020
                                  sum
                                  -----------
                                        60020
1>
2> drop table employee
3> GO
1>



Use multiple aggregate functions in a COMPUTE clause

1>
2> CREATE TABLE project   (project_no   CHAR(4) NOT NULL,
3>                         project_name CHAR(15) NOT NULL,
4>                         budget FLOAT NULL)
5> GO
1> insert into project values ("p1", "Search Engine",        120000.00)
2> insert into project values ("p2", "Programming",          95000.00)
3> insert into project values ("p3", "SQL",                  186500.00)
4> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
1> select * from project
2> GO
project_no project_name    budget
---------- --------------- ------------------------
p1         Search Engine                     120000
p2         Programming                        95000
p3         SQL                               186500
(3 rows affected)
1>
2> -- Use multiple aggregate functions in a COMPUTE clause.
3>
4> SELECT project_no, budget
5>        FROM project
6>        WHERE budget < 150000
7>       COMPUTE SUM(budget), AVG(budget)
8>
9> drop table project
10> GO
project_no budget
---------- ------------------------
p1                           120000
p2                            95000
           sum
           ========================
                             215000
           avg
           ========================
                             107500
1>