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 2005中的处理方式:

      测试环境

    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


      删除测试环境

    Drop Table T

      动态SQL:

    DECLARE @S VARCHAR(MAX) SET @S='' SELECT @S=@S+',['+时间+']' FROM T GROUP 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 ')
  • 相关阅读:
    laydate 时间框弹窗点击弹出后立马消失的问题解决
    万字长文:ELK(V7)部署与架构分析
    人声消除的原理算法源码及方案实现
    主动降噪技术(ANC)的前生今世–行业分析
    主动降噪技术(ANC)的前生今世--原理仿真
    主动降噪技术(ANC)的前生今世--概念历史
    音频人生
    解决 Flask-sqlalchemy 中文乱码
    使用 key 登录时分开记录操作历史记录
    OpenSSH 使用技巧
  • 原文地址:https://www.cnblogs.com/guxingwork/p/3298478.html
Copyright © 2011-2022 走看看