SQL 按日期统计后列转行

以下是带批注的 PIVOT 语法。

SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

    [第二个透视的列] AS <列名称>,

    ...

    [最后一个透视的列] AS <列名称>,

FROM

    (<生成数据的 SELECT 查询>)

    AS <源查询的别名>

PIVOT

(

    <聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

    IN ( [第一个透视的列], [第二个透视的列],

    ... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;

 

示例1:

CREATE TABLE #Product
    (
      DaysToManufacture INT ,
      StandardCost DECIMAL(12, 4)
    );
GO
INSERT  INTO #Product
VALUES  ( 0, 5.0885 );
INSERT  INTO #Product
VALUES  ( 0, 5.0885 );
INSERT  INTO #Product
VALUES  ( 1, 223.88 );
INSERT  INTO #Product
VALUES  ( 1, 223.88 );
INSERT  INTO #Product
VALUES  ( 2, 359.1082 );
INSERT  INTO #Product
VALUES  ( 4, 949.4105 );

SELECT  DaysToManufacture ,
        AVG(StandardCost) AS AverageCost
FROM    #Product
GROUP BY DaysToManufacture;

查询结果:

DaysToManufacture    AverageCost
0    5.088500
1    223.880000
2    359.108200
4    949.410500


-- Pivot table with one row and five columns
SELECT  'AverageCost' AS Cost_Sorted_By_Production_Days ,
        [0] ,
        [1] ,
        [2] ,
        [3] ,
        [4]
FROM    ( SELECT    DaysToManufacture ,
                    StandardCost
          FROM      #Product
        ) AS SourceTable PIVOT
( AVG(StandardCost) FOR DaysToManufacture IN ( [0], [1], [2], [3], [4] ) ) AS PivotTable;

转置结果

Cost_Sorted_By_Production_Days    0    1    2    3    4
AverageCost    5.088500    223.880000    359.108200    NULL    949.410500

 

现实示例:

1、先统计结果

SELECT
datepart(month,ibb.CreateTime) AS [月份],datepart(day,ibb.CreateTime) as[日期],COUNT(DISTINCT ibb.BillNo) as [单据量],SUM(ibbd.Quantity) as [件数]
FROM InBoundBill ibb (NOLOCK)
        JOIN InBoundBillDetail ibbd (NOLOCK)
                ON IBB.BillId = IBBD.BillId
WHERE ibb.TypeId = 30
        AND ibb.CreateTime > '2012-01-01' AND ibb.CreateTime < '2012-12-21'
        AND ibb.WarehouseId IN (1)
GROUP BY datepart(month,ibb.CreateTime),datepart(day,ibb.CreateTime)
ORDER BY datepart(month,ibb.CreateTime),datepart(day,ibb.CreateTime)

月份日期单据量件数
11492670
2399550
3487698
4487672
5507662
6605804
7666943
8439591
9599832
10530690
11554741
12631881
13574771
14577796
15409576
16420562
17445590
18667901
19406545
20427624
21320465
2533
26241412
27214318
28180251
29342483
30162240
31360480

 

2、列转行

;WITH tmp AS(
SELECT  DATEPART(month , ibb.CreateTime) AS [month] , DATEPART(day , ibb.CreateTime) AS [day] ,
        LTRIM(ISNULL(COUNT(DISTINCT ibb.BillNo) , 0))+'/'+LTRIM(ISNULL(SUM(ibbd.Quantity) , 0)) AS [Quantity]
FROM    InBoundBill ibb (NOLOCK)
JOIN    InBoundBillDetail ibbd (NOLOCK)
ON      IBB.BillId = IBBD.BillId
WHERE   ibb.TypeId = 30
        AND ibb.CreateTime > '2012-01-01'
        AND ibb.CreateTime < '2012-12-21'
        AND ibb.WarehouseId IN (1)
GROUP BY DATEPART(month , ibb.CreateTime) , DATEPART(day , ibb.CreateTime)

)

SELECT  *
FROM    tmp PIVOT ( MAX([Quantity]) FOR [day] 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]) ) piv

ORDER BY [month]

 

月     日12345678910111213141516171819202122232425262728293031
1492/670399/550487/698487/672507/662605/804666/943439/591599/832530/690554/741631/881574/771577/796409/576420/562445/590667/901406/545427/624320/4650003/3241/412214/318180/251342/483162/240360/480

转载于:https://www.cnblogs.com/pato/archive/2012/12/21/2828139.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值