2016-07-29 32 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中會滿足您的要求更好。 您可以從靜態透視示例開始,瞭解結構,然後處理您的示例。在最後一步,您可以將您的代碼轉換爲動態數據透視查詢