SQL Pivot问题

时间:2010-01-05 13:28:24

标签: sql-server pivot

在尝试使用SQL Server 2005构建时,我很难理解查询。

我有一张桌子,让我们称之为销售:

SaleId(int)(pk)EmployeeId(int)SaleDate(datetime)

我想制作一份报告,列出员工在给定数据范围内每天的销售总数。

所以,例如,我希望看到2009年12月1日 - 2009年12月31日的所有销售情况,输出如下:

EmployeeId  Dec1   Dec2 Dec3   Dec4

1            10    10    1     20
2            25    10    2      2

..但是日期需要灵活。

我已经搞砸了使用枢轴,但似乎无法得到它,欢迎任何想法!

2 个答案:

答案 0 :(得分:4)

这是一个完整的例子。您可以更改日期范围以满足您的需求。

use sandbox;
create table sales (SaleId int primary key, EmployeeId int, SaleAmt float, SaleDate date);

insert into sales values (1,1,10,'2009-12-1');
insert into sales values (2,1,10,'2009-12-2');
insert into sales values (3,1,1,'2009-12-3');
insert into sales values (4,1,20,'2009-12-4');

insert into sales values (5,2,25,'2009-12-1');
insert into sales values (6,2,10,'2009-12-2');
insert into sales values (7,2,2,'2009-12-3');
insert into sales values (8,2,2,'2009-12-4');

SELECT * FROM
      (SELECT EmployeeID, DATEPART(d, SaleDate) SaleDay, SaleAmt
                  FROM sales
                  WHERE SaleDate between '20091201' and '20091204'
                  ) src
PIVOT (SUM(SaleAmt) FOR SaleDay
IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])) AS pvt;

结果(实际上将列出31列(所有可能的月份日期),但我只是显示前4位):

EmployeeID      1       2       3       4
1               10      10      1       20
2               25      10      2       2

答案 1 :(得分:1)

我修改了一下,我认为这是你用PIVOT做到的方法:

select  employeeid
,       [2009/12/01] as Dec1
,       [2009/12/02] as Dec2
,       [2009/12/03] as Dec3
,       [2009/12/04] as Dec4
from    sales pivot (
        count(saleid) 
        for saledate
        in ([2009/12/01],[2009/12/02],[2009/12/03],[2009/12/04])
    ) as pvt

(这是我的表:

CREATE TABLE [dbo].[sales](
[saleid] [int] NULL,
[employeeid] [int] NULL,
[saledate] [date] NULL

数据为:emp1为'2009/12/01'为10行,emp2为'2009/12/01'为25行,emp1为'2009/12/02'为10行等)

现在,我必须说,这是我第一次使用PIVOT,也许我没有抓住它,但这对我来说似乎毫无用处。我的意思是,如果你不能动态地指定列,那么有一个交叉表有什么用呢?

编辑:ok- dcp的回答是这样做的。诀窍是,您不必明确命名SELECT列表中的列,*实际上将正确扩展到第一个'unpivoted'列的列,以及为FOR中显示的每个值动态生成的列。 PIVOT构造中的IN子句。