zoukankan      html  css  js  c++  java
  • SQL Server 2005 处理交叉表

    日期                   时间   售货金额
    2006-01-02       早上    50
    2006-01-02       中午    20
    2006-01-02       晚上    30
    2006-01-02       零晨    40
    2006-01-03       早上    40
    2006-01-03       中午    60
    2006-01-03       晚上    50
    2006-01-03       零晨    50
    2006-01-04       早上    80
    2006-01-04       中午    60
    2006-01-04       晚上    20
    2006-01-04       零晨    40
    ...........................
    ............................
    ...........................
    .........
    能否用行转列的方式在进行数据查询中将上面数据的查询结果显示为:


    日期              早上   中午  晚上   零晨   金额小计
    2006-01-02   50     20    30      40     140
    2006-01-03   40     60    50      50     200
    2006-01-04   80     60    30      20     190
    ..........
    ..........


    --SQL 20005中的处理方式:

    --测试环境
    Create table T(日期 datetime,时间 varchar(20),售货金额 int)
    insert into T select '2006-01-02','早上',50
    union all select '2006-01-02','中午',20
    union all select '2006-01-02','晚上',30
    union all select '2006-01-02','零晨',40
    union all select '2006-01-03','早上',40
    union all select '2006-01-03','中午',60
    union all select '2006-01-03','晚上',50
    union all select '2006-01-03','零晨',50
    union all select '2006-01-04','早上',80
    union all select '2006-01-04','中午',60
    union all select '2006-01-04','晚上',20
    union all select '2006-01-04','零晨',40


    --查询
    select * ,金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB
    PIVOT
    ( max(售货金额)
      for 时间 in
    ([早上],[中午],[晚上],[零晨])
    ) as PT
    --结果
    /*
    日期                                  早上       中午        晚上        零晨        金额小计
    ----------------------- ----------- ----------- ----------- ----------- -----------
    2006-01-02 00:00:00.000 50          20          30          40          140
    2006-01-03 00:00:00.000 40          60          50          50          200
    2006-01-04 00:00:00.000 80          60          20          40          200

    (3 行受影响)
    */
    --删除测试环境
    Drop Table T

    ---动态SQL

    DECLARE @S VARCHAR(MAX)
    SET @S=''SELECT @S=@S+',['+时间+']' FROM TGROUP BY 时间
    SET @S=STUFF(@S,1,1,'')
    EXEC('select 日期,'+@S+',金额小计=(select sum(售货金额) from T where 日期=PT.日期 ) from T as TAB
    PIVOT( max(售货金额) for 时间 in ('+@S+')) as PT')

  • 相关阅读:
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    C++笔记(3):一些C++的基础知识点
    机器学习&数据挖掘笔记_15(关于凸优化的一些简单概念)
    机器学习&数据挖掘笔记_14(GMM-HMM语音识别简单理解)
    机器学习&数据挖掘笔记_13(用htk完成简单的孤立词识别)
    Deep learning:四十三(用Hessian Free方法训练Deep Network)
    机器学习&数据挖掘笔记_12(对Conjugate Gradient 优化的简单理解)
    Deep learning:四十二(Denoise Autoencoder简单理解)
    Deep learning:四十一(Dropout简单理解)
    算法设计和数据结构学习_6(单链表的递归逆序)
  • 原文地址:https://www.cnblogs.com/eric_ibm/p/crosstable.html
Copyright © 2011-2022 走看看