SQL Server中的动态SQL枢轴 [英] dynamic sql pivot in sql server

查看:114
本文介绍了SQL Server中的动态SQL枢轴的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在在sql server 2008中运行此查询,但是很快计划在sql报表服务中创建报表时将其移动:

Running this query in sql server 2008 now, but soon plan to move it in creating a report in sql reporting services:

SELECT * from ( SELECT Amount, Year, column1, column2,column3 from BUYSCTE ) BUY 

我在没有枢轴的情况下在查询上方运行的表结果是这个

My table results running above query without the pivot is this

Column1 | Column2 | Column3| FYYear| Amount|

 1           cat     dog      2011   50 
 1           cat     dog      2012   75
 1           cat     dog      2013   65
 2          fish     snake    2011   23
 2          fish     snake    2012   39
 2          fish     snake    2013   59
 .. 
 ..  
 ..                           2016

所以基本上我希望结果像这样结束:

so basically I want the results to end up like this:

Column1 | Column2 | Column3| 2011| 2012 | 2013 
 1           cat     dog      50    75     65
 2          fish     snake    23    39     59

因此我想实现此目的的查询是我首先创建一个表变量并将其设置为动态变量,并进行了这样的数据透视,

so the query I came up with to make this happen is I first created a table variable and made it a dynamic variable and did a pivot like this,

declare @Year nvarchar(Max)
set @Year = STUFF(
(SELECT ', ' + quotename(FYYear)
from BUYSCTE Group By FYYear order by
FYYear For XML PATH(''))
, 1, 2, '');

上面的值填充了@Year值:[2011],[2012],[2013],[2014],[2015],[2016]

The above populates the @Year value with: [2011], [2012], [2013], [2014], [2015], [2016]

我知道,因为我将上面的选择更改为SELECT @Year,只是为了检查该值设置是否正确

I know that because I change the above select to SELECT @Year just to check if the value is set correctly

从那里,我将表变量之后的上述选择更改为

from there I change the above select after the table variable to

SELECT * from ( SELECT Amount, FYYear, column1, column2,column3 from BUYSCTE ) BUY 
PIVOT( SUM(Amount) FOR FYYear in ([@Year]) ) pvt

但是我的结果最终是这样

but my results end up being this

 Column1 | Column2 | Column3| @Year|
 1           cat     dog      null   
 2          fish     snake    null

我做错了什么?我似乎看不见自己看不见的小东西.即使我将汇总函数从SUM更改为COUNT,它也会为@Year列值提供0而不是null

What am I doing wrong? it seems like something small I am missing that I cannot see myself. even if I change the aggregate function from SUM to COUNT it gives 0 for the @Year column values instead of null

推荐答案

您很亲密,但是要使此工作正常,您必须使用动态SQL构造PIVOT,然后执行它.因此,在填充变量@Year之后,您需要执行以下操作:

You are close, but for this to work you have to construct your PIVOT using dynamic SQL and then execute it. So, after you populate your variable @Year, you need to do something like this:

DECLARE @Query VARCHAR(MAX)

SET @Query = '
SELECT * from ( SELECT Amount, FYYear, column1, column2,column3 from BUYSCTE ) BUY 
PIVOT( SUM(Amount) FOR FYYear in ('+ @Year + ') ) pvt'

EXEC(@Query)

尽管在执行此操作之前,您应该先查看此链接.

Though before doing this, you should take a look at this link.

这篇关于SQL Server中的动态SQL枢轴的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆