zoukankan      html  css  js  c++  java
  • 行转列的思考

    最近遇到一个行转列的问题,给定一个时间段,统计每天每个车的签到情况,用动态拼接的方法实现,受Varchar(8000)的影响,拼接的SQL语句不能太长,遇到这种动态列头的问题,这种方法肯定不是很好,希望有高人指点新招~

    /*建立车信息表*/

    复制代码
    go
    if NOT EXISTS (select 1 from sysobjects where id = object_id('Car') AND type='U')
    BEGIN 
         CREATE TABLE Car 
        (
         Carid UNIQUEIDENTIFIER ,
         CarName VARCHAR(100)
         )
    end
    go
    /*插入一些数据*/
    INSERT INTO Car  SELECT NEWID(),'car1' UNION
                     SELECT NEWID(),'car2' UNION
                     SELECT NEWID(),'car3' UNION
                     SELECT NEWID(),'car4' UNION
                     SELECT NEWID(),'car5' UNION
                     SELECT NEWID(),'car6' UNION
                     SELECT NEWID(),'car7' 
    /*建立签到表*/
    go
    if NOT EXISTS (select 1 from sysobjects where id = object_id('CarTime') AND type='U')
    BEGIN 
         CREATE TABLE CarTime 
        (
         CarTimeID UNIQUEIDENTIFIER ,
         CarId UNIQUEIDENTIFIER, 
         operateDate DATETIME
         )
    END
    go
    /*插入一些数据*/
    DECLARE @i INT 
    SET @i=1
    WHILE (@i<=10)
    BEGIN 
       INSERT INTO CarTime SELECT NEWID(),CarId,'2012-08-'+CONVERT(VARCHAR(10),@i) FROM Car
       SET @i=@i+1
    end      
    /*统计一段时间所有车每天的签到情况*/
    go
    if  EXISTS (select 1 from sysobjects where id = object_id('sp_CarTimeReport') AND type='P')
    BEGIN 
       DROP PROC sp_CarTimeReport
    END 
    go       
    CREATE PROC [dbo].[sp_CarTimeReport]  
     @BeginDate DATETIME,  
     @EndDate DATETIME 
    AS   
    BEGIN    
       DECLARE @begin DATETIME  
       DECLARE @end DATETIME  
       SET @begin=CONVERT(DATETIME,CONVERT(VARCHAR(10),@BeginDate,120))  
       SET @end=CONVERT(DATETIME,CONVERT(VARCHAR(10),@EndDate,120))  
         
       DECLARE @index DATETIME  
       SET @index=@begin  
       DECLARE @sql VARCHAR(8000)  
       SET @sql=' SELECT car.CarName as 车名'  
       WHILE(@index<=@end)  
       BEGIN  
      SET @sql=@sql+' ,case when sum(case when convert(varchar(10),carTime.OperateDate,120)='''+ CONVERT(VARCHAR(10),@index,120) +''' then 1 else null end) is not null then '''' else null end  as '''+ CONVERT(VARCHAR(10),@index,120) +'''  '  
      SET @index=@index+1  
       end  
      SET @sql=@sql+' FROM  Car left join CarTime on Car.carid=CarTime.carid 
             group by Car.carid,car.CarName   
             order by Car.CarName '           
       EXEC(@sql)  
    END  
    
     
    
    --DROP TABLE car
    --DROP TABLE cartime
    --DROP PROC  sp_CarTimeReport
    
    --EXEC sp_CarTimeReport '2012-08-01','2012-08-30'
    复制代码

    运行效果如下:

     

     
  • 相关阅读:
    c++:资源管理(RAII)、new/delete的使用、接口设计与声明、swap函数
    C++普通链表增删、倒序打印
    Android-UI:按钮监听&文字/图片/进度条&动态变更&dialog&布局&自定义布局/控件/响应事件
    Android-活动生命周期&Bundle回收临时数据&活动启动模式&常用技巧
    C++字符串空格替换题
    C++二维数组查找题
    c++:const、初始化、copy构造/析构/赋值函数
    C++赋值运算符函数
    Android-活动创建&Toast&Menu&Intent
    用yarn代替cnpm,cnpm漏包有点严重
  • 原文地址:https://www.cnblogs.com/soundcode/p/2690072.html
Copyright © 2011-2022 走看看