Author |
Topic |
ranalk
Starting Member
49 Posts |
Posted - 2012-12-02 : 03:28:21
|
Hi all,Can you please assist with the script for converting the table on the left to the one on the right?Thanks in advance! |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-12-02 : 03:40:31
|
[code]SELECT *FROM Table tUNPIVOT (Code FOR Name IN ([Phil],[Bill],[Larry]))u[/code]for making names dynamic you can use dynamic sql------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
|
|
sodeep
Master Smack Fu Yak Hacker
7174 Posts |
Posted - 2012-12-02 : 10:38:26
|
[code]Select distinct Date,MAX(Case When Name = 'Phil' then Code End) OVER(PARTITION BY Date)as Phil,MAX(Case When Name = 'Bill' then Code End) OVER(PARTITION BY Date)as Bill,MAX(Case When Name = 'Larry' then Code End) OVER(PARTITION BY Date)as Larryfrom Table[/code] |
|
|
ranalk
Starting Member
49 Posts |
Posted - 2012-12-05 : 04:00:02
|
quote: Originally posted by visakh16
SELECT *FROM Table tUNPIVOT (Code FOR Name IN ([Phil],[Bill],[Larry]))u for making names dynamic you can use dynamic sql------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
Unfortunately, I was unable to unpivot due to SQL errorscan you assist? DECLARE @table TABLE ([Date] Date,[Name] nvarchar(15),[Code] nvarchar(15)) INSERT INTO @table ([date],[name],[code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO @table ([date],[name],[code]) VALUES ('11/12/2012','phil','1111') INSERT INTO @table ([date],[name],[code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO @table ([date],[name],[code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO @table ([date],[name],[code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO @table ([date],[name],[code]) VALUES ('11/12/2012','Bill','3333') SELECT * FROM @table SELECT *FROM @table tUNPIVOT (Code FOR Name IN ([Phil],[Bill],[Larry]))u |
|
|
bandi
Master Smack Fu Yak Hacker
2242 Posts |
Posted - 2012-12-05 : 05:48:49
|
[code]DECLARE @table TABLE ([Date] Date,[Name] nvarchar(15),[Code] varchar(15))INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','phil','1111') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Bill','3333') SELECT *FROM @table tPIVOT( MAX(code) FOR [Name] IN ([phil], [larry], [bill]) )u[/code]--Chandu |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
|
ranalk
Starting Member
49 Posts |
Posted - 2012-12-06 : 01:57:54
|
Thanks for the help, I have managed to Pivot.Now I will need to put some thinking regarding dynamic pivoting for the same table... |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2012-12-06 : 02:14:55
|
quote: Originally posted by ranalk Thanks for the help, I have managed to Pivot.Now I will need to put some thinking regarding dynamic pivoting for the same table...
see the article. it does excatly that------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
|
|
ranalk
Starting Member
49 Posts |
Posted - 2012-12-06 : 02:17:43
|
quote: Originally posted by visakh16
quote: Originally posted by ranalk Thanks for the help, I have managed to Pivot.Now I will need to put some thinking regarding dynamic pivoting for the same table...
see the article. it does excatly that------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
Cool, will check it out. |
|
|
bandi
Master Smack Fu Yak Hacker
2242 Posts |
Posted - 2012-12-06 : 02:42:37
|
[code]CREATE TABLE #table ([Date] Date,[Name] nvarchar(15),[Code] varchar(15))INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','phil','1111') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','Bill','3333') DECLARE @cols varchar(1000) ='', @str varchar(max) =''SET @cols = STUFF((SELECT distinct ',' + QUOTENAME([NAME]) FROM #table FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')SET @str = 'SELECT [DATE], ' + @cols + ' FROM #table t PIVOT ( MAX(code) FOR [Name] IN ( ' + @cols + ' ))u 'EXEC(@str)DROP TABLE #table[/code]--Chandu |
|
|
ranalk
Starting Member
49 Posts |
Posted - 2012-12-06 : 02:48:43
|
quote: Originally posted by bandi
CREATE TABLE #table ([Date] Date,[Name] nvarchar(15),[Code] varchar(15))INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','phil','1111') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO #table ([date],[name],[Code]) VALUES ('11/12/2012','Bill','3333') DECLARE @cols varchar(1000) ='', @str varchar(max) =''SET @cols = STUFF((SELECT distinct ',' + QUOTENAME([NAME]) FROM #table FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')SET @str = 'SELECT [DATE], ' + @cols + ' FROM #table t PIVOT ( MAX(code) FOR [Name] IN ( ' + @cols + ' ))u 'EXEC(@str)DROP TABLE #table Nicely done!Thanks a lot.--Chandu
|
|
|
bandi
Master Smack Fu Yak Hacker
2242 Posts |
Posted - 2012-12-06 : 02:51:25
|
Welcome --Chandu |
|
|
Lampas
Starting Member
1 Post |
Posted - 2012-12-07 : 00:31:04
|
--This is another way of pivoting that gives more freedom to add other value to your results, like do a calculation on the results, while you pivot.-- Create your tableDECLARE @table TABLE ([Date] Datetime,[Name] nvarchar(15),[Code] varchar(15))INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','phil','1111') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Bill','3333') -- Create your pivot table -- note that an empty string is added against each name-- This extra table might seem to be a lot of work, but it is a clean and fast way of codingDECLARE @Pivotable TABLE ([Name] nvarchar(15),Phil varchar(1),Larry varchar(1),Bill varchar(1))INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Phil','',NULL,NULL) INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Larry',NULL,'',NULL) INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Bill',NULL,NULL,'') -- Pivot statement -- this gives more ablility to manipulate and use isnull and other functions in your statement-- I did this in SQL2000, so it is fully backwards compatible as well. -- The pivot statement in SQL is very effective if you need a simple pivoting onlySELECT [Date], Phil = Max(Code+P.Phil), Larry = Max(Code+P.Larry), Bill = Max(Code+P.Bill)FROM @table t join @Pivotable P on T.[Name] = P.[Name]group by [Date] |
|
|
ranalk
Starting Member
49 Posts |
Posted - 2012-12-07 : 02:02:58
|
quote: Originally posted by Lampas --This is another way of pivoting that gives more freedom to add other value to your results, like do a calculation on the results, while you pivot.-- Create your tableDECLARE @table TABLE ([Date] Datetime,[Name] nvarchar(15),[Code] varchar(15))INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','phil','xxxx') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','phil','1111') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Larry','yyyy') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Larry','2222') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/11/2012','Bill','zzzz') INSERT INTO @table ([date],[name],[Code]) VALUES ('11/12/2012','Bill','3333') -- Create your pivot table -- note that an empty string is added against each name-- This extra table might seem to be a lot of work, but it is a clean and fast way of codingDECLARE @Pivotable TABLE ([Name] nvarchar(15),Phil varchar(1),Larry varchar(1),Bill varchar(1))INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Phil','',NULL,NULL) INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Larry',NULL,'',NULL) INSERT INTO @Pivotable ([Name],Phil,Larry,Bill) VALUES ('Bill',NULL,NULL,'') -- Pivot statement -- this gives more ablility to manipulate and use isnull and other functions in your statement-- I did this in SQL2000, so it is fully backwards compatible as well. -- The pivot statement in SQL is very effective if you need a simple pivoting onlySELECT [Date], Phil = Max(Code+P.Phil), Larry = Max(Code+P.Larry), Bill = Max(Code+P.Bill)FROM @table t join @Pivotable P on T.[Name] = P.[Name]group by [Date]
But it is not dynamic and forcing you to add each records manually.But thanks! |
|
|
|
|
|