2

我已经阅读了 SQL 中的 pivot 并查看了大量示例,但我无法让它以我想要的方式工作。我有一个跟踪员工购买的交易历史表。

例子:

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

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

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

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

编辑好的,如果我没有准备好请求帮助,我深表歉意。我大部分时间都在为此工作,并且感到沮丧和疲倦。我有超过 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

我需要指定日期之间每个月的总月销售额。Nov 将显示在月份的开始和结束列。源表很简单:Employee、transdate、receipt、location 等。

4

2 回答 2

3

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

我只转了 3 个月,但希望你能明白。通常您在 From 之后有嵌套的 Select,因为您只想在某些列上进行透视/分组。然后出现 Pivot,您可以在其中列出要成为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;
于 2012-11-12T08:32:00.900 回答
0

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

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

于 2012-11-12T08:15:21.770 回答