2014-11-02 51 views
0

我有很大的表151列 - 每列表示一個商店(150商店* 1列)加上一個日期列。Sql查詢從列轉換爲行

Date   Store001  Store002  Store003  Store004 ................... Store150 
---------------------------------------------------------------------------------------------------  
01/01/14  12560   8546   7468   10154      16845 

31/10/14  13978   7584   8456   13458      25458 

我需要的結果如下:

Date   Store#  Amount 
----------------------------------- 
01/01/14  Store001  12560 
01/01/14  Store002  8546 
01/01/14  Store003  7468 
01/01/14  Store004  10154 
etc., 
+0

檢查的[逆透視與列名]我的回答 – 2014-11-02 09:45:32

+0

可能重複(http://stackoverflow.com/questions/19055902/unpivot-with-column-name) – 2014-11-02 10:05:35

回答

0
Create table yourtable([Date] date,Store001 int ,Store002 int) 
insert into yourtable ([Date],Store001,Store002) 
values 
(GETDATE(),1243,546), 
(GETDATE(),4545,798), 
(GETDATE(),5687,456), 
(GETDATE(),0756,685) 

簡單查詢

;WITH CTE 
AS 
    (
    SELECT * FROM (
    SELECT [Date],Store001,Store002 FROM yourtable) T 
    UNPIVOT (Value FOR N IN (Store001,Store002))P 
) 
SELECT [Date],N as Store#,SUM(Value) as Amount 
FROM CTE 
GROUP BY [Date],N 

動態SQL

declare @cols nvarchar(max) 
select @cols = coalesce(@cols+N',', N'') + quotename(c.name) from syscolumns c 
inner join sysobjects o on c.id = o.id and o.xtype = 'u' 
where o.name = 'yourtable' and c.name not in ('Date') order by c.colid 
select @cols 
declare @query nvarchar(max) 

select @query = N' 
;WITH CTE 
AS 
    (
    SELECT * FROM (
    SELECT [Date], ' + @cols + ' 
FROM yourtable) T 
    UNPIVOT (Value FOR N IN (' + @cols + '))P 
) 
SELECT [Date],N as Store#,SUM(Value) as Amount 
FROM CTE 
GROUP BY [Date],N 
' 
print @query 
exec sp_executesql @query 

輸出

Date   Store#  Amount 
2014-11-02 Store001 12231 
2014-11-02 Store002 2485 
+0

優秀Ganesh先生。我剛剛註冊並從未期待如此快速的迴應。 – 2014-11-02 14:14:19

+0

@MohanYGK歡迎您如果您認爲這有幫助,請將其標記爲答案 – 2014-11-02 14:15:45

+0

我們正在爲包括生產,庫存,零售管理,工資,財務等在內的150個零售店實施AX 2012,我正在尋找我的IT經理職位公司。我不知道你的背景和興趣,但如果你有興趣,請告訴我。 – 2014-11-02 14:16:09