zoukankan      html  css  js  c++  java
  • 交叉查询

    (一) 
    USE Northwind
    select
    OrderID,
    count(case when Quantity between 20 and 30 then ProductID end) as '20-30',
    count(case when Quantity between 30 and 40 then ProductID end) as '30-40',
    count(case when Quantity between 40 and 50 then ProductID end) as '40-50',
    count(case when Quantity between 50 and 60 then ProductID end) as '50-60',
    count(case when Quantity between 60 and 70 then ProductID end) as '60-70'
    from [Order Details]
    group by OrderID

    (二)

    --测试数据  
      create   table   tb(
    工资年度   int,工资月份   int,编号   varchar(10),姓名   varchar(10),部门   varchar(10),基本工资   int,实发工资   int)  
      insert   tb   select   2004,11,'A001','AAA','DDD',1000,1800  
      union   all   select   2004,11,'B001','BBB','DDD',800   ,1500  
      union   all   select   2004,12,'A001','AAA','DDD',1100,2000  
      union   all   select   2004,12,'B001','BBB','DDD',1000,1600  
      go  
       
      --
    查询处理  
      declare   @s1   nvarchar(4000),@s2   nvarchar(4000),@i   int  
      select   @s1='',@s2='',@i=0  
      select   @s1=@s1+','+quotename(fd+'_
    基本工资')  
      +'=sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   a.
    基本工资   end)'  
      +case   @i   when   0   then   ''  
      else   ','+quotename(fd+'_
    基本工资增幅')  
      +'=cast(cast(sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   a.
    基本工资-b.基本工资   end)*100.'  
      +'/sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   b.
    基本工资   end)'  
      +'   as   decimal(10,2))   as   varchar)+''%'''  
      end,  
      @s2=@s2+','+quotename(fd+'_
    实发工资')  
      +'=sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   a.
    实发工资   end)'  
      +case   @i   when   0   then   ''  
      else   ','+quotename(fd+'_
    实发工资增幅')  
      +'=cast(cast(sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   a.
    实发工资-b.实发工资   end)*100.'  
      +'/sum(case   when   a.
    工资年度='+工资年度  
      +'   and   a.
    工资月份='+工资月份  
      +'   then   b.
    实发工资   end)'  
      +'   as   decimal(10,2))   as   varchar)+''%'''  
      end,  
      @i=@i+1  
      from(  
      select    
     
    工资年度=rtrim(工资年度),  
     
    工资月份=rtrim(工资月份),  
      fd=rtrim(
    工资年度)+'_'+rtrim(工资月份)  
      from   tb   group   by  
    工资年度,工资月份)a    
      exec('select   a.
    编号,a.姓名,a.部门'+@s1+@s2+'  
      from   tb   a  
      left   join   tb   b   on   a.
    编号=b.编号   and   a.姓名=b.姓名   and   a.部门=b.部门  
      and   a.
    工资年度=b.工资年度+(b.工资月份)/12  
      and   a.
    工资月份=b.工资月份%12+1  
      group   by   a.
    编号,a.姓名,a.部门')  
      go  
      --
    删除测试  
      drop   table   tb  
       
      /*--
    测试结果--*/  

    Wrong:

    select     a.编号,a.   姓名   ,a.   部门,[2004_11_基本工资]=b.基本工资,  

     [2004_12_基本工资]=a.基本工资,  

     [200412_基本工资增幅]=cast((1-cast(a.基本工资   as   decimal(8,2))/b.基本工资)*100     as   varchar(10))+'%',  

     [2004_11_实发工资]=b.实发工资,   [2004_12_实发工资]   =a.实发工资,  

     [200412_实发工资增幅]=cast((1-cast(a.实发工资   as   decimal(8,2))/b.实发工资)*100     as   varchar(10))+'%'  

          from   (select     *     from       tb   where   工资月份=12)   a     left     join  

     (select     *     from       tb   where   工资月份=11)     b  

     on       a.编号=b.编号     and   a.姓名=b.姓名     and   a.部门=b.部门

    select   a.*,   (a.2004_12_基本工资   -   a.2004_11_基本工资)   '200412_基本工资增幅',  

     (a.2004_12_实发工资   -   a.2004_11_实发工资)   '200412_实发工资增幅',  

     (  

     select   max(编号)   as   编号,max(姓名)   as   姓名,max(部门)   as   部门,  

     '2004_11_基本工资'=max(case   when   工资年度=2004   and   工资月份=11   then   基本工资   else   0   end),  

     '2004_12_基本工资'=max(case   when   工资年度=2004   and   工资月份=12   then   基本工资   else   0   end),  

     '2004_11_实发工资'=max(case   when   工资年度=2004   and   工资月份=11   then   实发工资   else   0   end),  

     '2004_12_实发工资'=max(case   when   工资年度=2004   and   工资月份=12   then   实发工资   else   0   end)  

     from   tb    

     group   by   编号,姓名,部门   )  

  • 相关阅读:
    在Ubuntu下安装软件
    HIVE Thrift Server使用总结
    用Wubi来安装Ubuntu 12
    linux命令总结
    Linux Sed简介
    Linux批量重命名文件
    算法学习的轨迹(转)
    写入es速率优化
    走近Flex组件系列(三):按扭组件(Button,CheckBox,LinkBar,LinkButton,PopUpButton,RadioButton,ToggleButtonBar)
    走近Flex组件系列(二):简单实用的Alert组件
  • 原文地址:https://www.cnblogs.com/Isabella/p/773666.html
Copyright © 2011-2022 走看看