【问题标题】:T-SQL Pivot queryT-SQL 透视查询
【发布时间】:2017-02-22 09:20:03
【问题描述】:

我有一个包含laserform名称和日期的表格,例如

我的表名为 myBWB_LaserForms

laserform   editwhen
LRAP1.lpw   2009-09-03 16:06:00.000
CON29R.lpw  2009-10-29 12:35:00.000
UN1.lpw     2010-03-02 11:38:00.000
UN244.lpw   2012-04-19 12:14:00.000
LT3.lpw     2013-01-02 11:00:00.000
LRAP1.lpw   2007-12-10 15:34:00.000

我要生成的是一份报告,其中左侧有激光形式的名称,顶部有年份,例如2004、2005、2006,然后每个相交的单元格都会计算该表单名称在该特定年份的记录数。

通常我会做类似的事情

select l.laserform,
(select count(*) from mybwb_laserforms l1 where l1.laserform=l.laserform and year(editwhen)=2004) AS [2004],
(select count(*) from mybwb_laserforms l2 where l2.laserform=l.laserform and year(editwhen)=2005) AS [2005],
(select count(*) from mybwb_laserforms l3 where l3.laserform=l.laserform and year(editwhen)=2006) AS [2006],
(select count(*) from mybwb_laserforms l4 where l4.laserform=l.laserform and year(editwhen)=2007) AS [2007]
from mybwb_laserforms l
group by l.laserform
order by l.laserform

但是我意识到这是非常可怕的 SQL,我应该对此更加聪明。

我一直在尝试学习如何使用枢轴功能,但我很难理解它。

此外,我发现的大多数示例似乎都对查询的列进行了硬编码 - 如果数据透视表可以是动态的并获得唯一的 year(editwhen) 值,那就太好了,这样我接下来就不必修改查询了一年和之后的一年。

【问题讨论】:

    标签: tsql pivot


    【解决方案1】:

    总结一下吧。

    select laserform,
    sum(case when year(editwhen)=2004 then 1 else 0 end) AS [2004],
    sum(case when year(editwhen)=2005 then 1 else 0 end) AS [2005],
    sum(case when year(editwhen)=2006 then 1 else 0 end) AS [2006],
    sum(case when year(editwhen)=2007 then 1 else 0 end) AS [2007]
    from mybwb_laserforms
    where year(editwhen) between 2004 and 2007
    group by laserform
    order by laserform
    

    或动态

    declare @Year int = year(GetDate());
    declare @Years TABLE ([year] varchar(4));
    insert into @Years values (@Year-12),(@Year-11),(@Year-10),(@Year-9);
    
    declare @SQLSums varchar(max) = '';
    select @SQLSums = @SQLSums +char(13)+', sum(case when year(editwhen)='+[year]+' then 1 else 0 end) AS ['+[year]+']'
    from @Years;
    
    DECLARE @SQL nvarchar(max) = 'select laserform'+ @SQLSums +'
    from mybwb_laserforms
    group by laserform
    where year(editwhen) between '+cast(@Year-12 as varchar)+' and '+cast(@Year-9 as varchar)+'
    order by laserform';
    
    --select @SQL;
    exec (@SQL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2021-06-29
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多