2016-07-29 34 views
0

我要转一个Select,但不能让我的头周围Pivot,我通过我更加困惑下面发现在许多教程:SQL Server的移调

“如果源数据得到妥善标准化会有过无需转换列和行,如果您发现自己需要定期执行这种类型的转换,那么您的模式设计有问题。“

具体怎么会正常化使Select为返回转置值:

SELECT 
    Date, Activity 
FROM 
    EVENTS 
WHERE 
    CITY = 'Seattle' 

(即,而不是活动的日期下去COLUMN1我想的日期去跨越的列)

+0

有多少日期,数字可能会有所不同?这个答案将决定你是否需要动态SQL来解决你的问题。 –

+0

我会猜测引用的陈述更多地指的是不透明而非透视。例如而不是有一个城市列,你有专栏“西雅图”,“SomeOtherCity”,“SomeOtherOtherCity”或类似的东西。正常化数据可以更容易地使用PIVOT,因为您不必对它进行标准化(UNPIVOT),然后使用PIVOT。如果没有PIVOT声明,它不会彻底启用PIVOT。 – ZLK

回答

0

也许你可以选择类似于以下示例的方法, 我使用了带有CTE语句和CASE运算符的dynamic SQL。 我只是用CTE表达式转换日期时间到日期数据类型不重复皈依每个CASE语句

declare @mm varchar(2) = datepart(mm,getdate()) 
declare @sql nvarchar(max) 
set @sql = N' 
;with cte as (
    SELECT 
     DATEPART(dd,[date]) dd, 
     convert(date,[date]) [date], 
     Activity 
    FROM 
     [events] 
) 
SELECT 
    case when dd = 1 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 2 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 3 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 17 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 18 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 19 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 20 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 28 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 29 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 30 then Activity end as ''' + '01/'[email protected]+'/2016' + ''' 
FROM cte' 
print @sql 
exec sp_executeSQL @sql 

过程中dynamic pivot query中会满足您的要求更好。 您可以从静态透视示例开始,了解结构,然后处理您的示例。在最后一步,您可以将您的代码转换为动态数据透视查询