亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用SQL Server中的“Pivot”將行轉換為列

使用SQL Server中的“Pivot”將行轉換為列

森欄 2019-05-24 16:10:44
使用SQL Server中的“Pivot”將行轉換為列我已經閱讀了MS數據透視表上的內容,但我仍然遇到問題。我有一個正在創建的臨時表,我們會說第1列是商店號,第2列是周數,最后第3列是某種類型的總和。周數也是動態的,商店數是靜態的。Store      Week     xCount-------    ----     ------102        1        96101        1        138105        1        37109        1        59101        2        282102        2        212105        2        78109        2        97105        3        60102        3        123101        3        220109        3        87我希望它作為一個數據透視表出來,像這樣:Store        1          2          3        4        5        6....----- 101        138        282        220102         96        212        123105         37        109將數字存儲在側面,將數字存儲在頂部。
查看完整描述

4 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊


如果您使用的是SQL Server 2005+,則可以使用該PIVOT函數將數據從行轉換為列。

聽起來你需要使用動態sql如果周未知,但最初使用硬編碼版本更容易看到正確的代碼。

首先,這里有一些快速表定義和使用數據:

CREATE TABLE #yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int);INSERT INTO #yt(
  [Store], 
  [Week], [xCount])VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

如果您的值已知,那么您將對查詢進行硬編碼:

select *from (
  select store, week, xCount  from yt) srcpivot(
  sum(xcount)
  for week in ([1], [2], [3])) piv;

請參閱SQL Demo

然后,如果您需要動態生成周數,您的代碼將是:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                    from yt                    group by Week                    order by Week            
                    FOR XML PATH(''), TYPE            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p 'execute(@query);

請參閱SQL Demo。

動態版本,生成week應轉換為列的數字列表。兩者都給出相同的結果:

| STORE |   1 |   2 |   3 |

---------------------------

|   101 | 138 | 282 | 220 |

|   102 |  96 | 212 | 123 |

|   105 |  37 |  78 |  60 |

|   109 |  59 |  97 |  87 |


查看完整回答
反對 回復 2019-05-24
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

我之前通過使用子查詢實現了同樣的目標。因此,如果您的原始表名為StoreCountsByWeek,并且您有一個單獨的表列出了商店ID,那么它將如下所示:


SELECT StoreID, 

    Week1=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=1),

    Week2=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=2),

    Week3=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=3)

FROM Store

ORDER BY StoreID

這種方法的一個優點是語法更清晰,并且可以更容易地連接到其他表以將其他字段拉入結果中。


我的軼事結果是,在不到一秒的時間內完成了幾千行的查詢,我實際上有7個子查詢。但正如評論中所指出的那樣,以這種方式執行它的計算成本更高,因此如果您希望它在大量數據上運行,請小心使用此方法。


查看完整回答
反對 回復 2019-05-24
  • 4 回答
  • 0 關注
  • 1141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號