SQL Server 2005数据透视查询语法帮助

时间:2012-11-11 23:09:31

标签: sql tsql sql-server-2005

我已经阅读了SQL中的数据透视图并查看了大量示例,但我无法按照我喜欢的方式使用它。我有一个跟踪员工购买的交易历史记录表。

示例:

Employee | Date       | Value
1234     | 2012-11-13 | 20.23

我需要为所有员工创建每月总销售额的摘要,如下所示:

Employee | Jan | Feb | Mar | ... | Dec| YearTotal

我对分组和获得月度总数感到困惑。 谢谢你的帮助!

EDIT 好的,如果我遇到没有准备请求帮助,我道歉。我一天中大部分时间都在努力工作,感到沮丧和疲惫。我有超过10年的SQL经验,但这是我第一次尝试进行数据透视查询,而我只是不知道它们应该如何工作,以及如何使它工作为了我的需要。我需要在星期一早上制作这些号码,所以大约需要7个小时。我最后的努力是为每个月运行一个单独的查询,然后将数据转储到excel中以用于报告。我希望这可以让最终用户无缝运行。

以下是我尝试的简化版本,该版本是从MSDN的示例中重新编写的:

SELECT CUSTOMER_NUMBER, [jan], [feb]
FROM 
    (
    SELECT month(transaction_date)
    FROM customer_item_purchases
    WHERE TRANSACTION_DATE BETWEEN '2011-11-16' AND '2012-11-15'
    )
PIVOT
(SUM(SALES_VALUE) IN ([JAN], [Feb]))
AS pvt

我需要在指定日期之间每月的总月销售额。 11月将出现在月末的列中。源表很简单:员工,转换,收据,位置等

2 个答案:

答案 0 :(得分:3)

小提琴示例(如果我没有登录但现在有效,不确定这是否会保存:http://sqlfiddle.com/#!6/8c96a/3/15

我只转了3个月,但你有希望得到这个想法。通常你有嵌套的Select after From,因为你只想在某些列上进行透视/分组。然后发生数据透视,您可以在其中列出要成为与FOR mnth IN ( [1], [2], [3] )字段对应的列名Month(Date) as mnth的值。

Create table Sales
( EmpId int, Date DateTime, Value integer );

Insert Into Sales (EmpId, Date, Value)
Values (1,'1/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'2/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'3/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'4/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'5/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'6/1/2012', 12);
Insert Into Sales (EmpId, Date, Value)
Values (1,'7/1/2012', 12);

Insert Into Sales (EmpId, Date, Value)
Values (2,'1/1/2012', 112);
Insert Into Sales (EmpId, Date, Value)
Values (2,'1/15/2012', 112);
Insert Into Sales (EmpId, Date, Value)
Values (2,'2/1/2012', 312);
Insert Into Sales (EmpId, Date, Value)
Values (2,'3/1/2012', 512);
Insert Into Sales (EmpId, Date, Value)
Values (2,'4/1/2012', 2);
Insert Into Sales (EmpId, Date, Value)
Values (2,'5/1/2012', 3);
Insert Into Sales (EmpId, Date, Value)
Values (2,'6/1/2012', 1);
Insert Into Sales (EmpId, Date, Value)
Values (2,'7/1/2012', 0);


SELECT EmpID, [1], [2], [3]
FROM 
(SELECT EmpID, Month(Date) as mnth, Value
FROM Sales) p
PIVOT
(
  Sum (Value)
  FOR mnth IN
( [1], [2], [3] )
) AS pvt
ORDER BY pvt.EmpID;

答案 1 :(得分:0)

您可以为每个月(1,2,3,...,12)设置一个包含2列的表格,另一个是3位数月份代码(' Jan',' 2月' Mar',...,' 12月')。您还可以使用包含在总和中的一系列案例陈述,仅计算每个员工的某个月销售额,然后按员工分组。

这是分组和加入数据库中两个基本概念的问题。我可以给你答案,但如果你真的想学习,那么我会同意米奇......表现出一些努力。