Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase 12345»»»

Pivot table for Microsoft SQL Server Expand / Collapse
Author
Message
Posted Wednesday, May 31, 2006 10:25 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, October 28, 2014 11:02 AM
Points: 2,397, Visits: 3,419

Comments posted to this topic are about the content posted at http://www.sqlservercentral.com/columnists/plarsson/pivottableformicrosoftsqlserver.asp

 




N 56°04'39.16"
E 12°55'05.25"
Post #283986
Posted Monday, June 12, 2006 12:29 AM
Forum Newbie

Forum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum Newbie

Group: General Forum Members
Last Login: Monday, June 2, 2014 10:22 PM
Points: 6, Visits: 141
Very nice! I will probably use this at some time. Thanks heaps!
Post #286566
Posted Monday, June 12, 2006 5:54 AM
SSC-Enthusiastic

SSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-Enthusiastic

Group: General Forum Members
Last Login: Thursday, July 22, 2010 8:59 AM
Points: 110, Visits: 952
Have you considered building the update string inside the loop, but executing it after you have iterated all the columns? O(1) < O(n)

Also, do you have any comments/caveats on the security implication of dynamic SQL used in this process?
Post #286604
Posted Monday, June 12, 2006 6:17 AM


SSCommitted

SSCommittedSSCommittedSSCommittedSSCommittedSSCommittedSSCommittedSSCommittedSSCommitted

Group: General Forum Members
Last Login: Tuesday, May 29, 2012 11:22 AM
Points: 1,755, Visits: 4,652

Thanks Peter - nice looking article.

I've not read the whole article yet (that's for when I have more time), but I wonder how your approach compares with the 'classic' crosstab/pivot table approaches...

http://www.sqlteam.com/item.asp?ItemID=2955
http://weblogs.sqlteam.com/jeffs/archive/2005/05/02/4842.aspx

If anyone has time to evaluate this, I'd be very grateful!




Ryan Randall

Solutions are easy. Understanding the problem, now, that's the hard part.
Post #286611
Posted Monday, June 12, 2006 7:55 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, October 28, 2014 11:02 AM
Points: 2,397, Visits: 3,419

Yes, in my very first early version. Then I realized that I could potentially come across the 8000 character limit for varchars.




N 56°04'39.16"
E 12°55'05.25"
Post #286643
Posted Monday, June 12, 2006 7:57 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, October 28, 2014 11:02 AM
Points: 2,397, Visits: 3,419

Thanks Ryan.

I have tried to keep the dynamic SQL executions to a minimum for obvious speed reasons. What I think I have provided is a base for creating crosstabs/pivots for users to learn from and hopefully, evolve with.

There are some things to do with the code to make it "universal". But I thought it would be best to show how to start from the beginning.

To make the code "universal" you first have to build a dynamic query for preaggregating the data in #Aggregates. That is not very hard to to! Also, you must change the parameters to the future stored procedure to allow two fully qualified names such as RemoteServer1.OwnerLocal.ThatTable.ThisField for the rows and columns. Even the CellData field in #Aggregates could be taken from a parameter this way and called with 'SUM(x)' or 'COUNT(y)'. You catch my drift.

An example could be

EXEC dbo.CrossTabPivot 'Table1.OfficeName', 'Table2.Category', 'COUNT(t)', ...




N 56°04'39.16"
E 12°55'05.25"
Post #286645
Posted Monday, June 12, 2006 8:01 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, October 28, 2014 11:02 AM
Points: 2,397, Visits: 3,419

Yes, SQL injection could possible be an issue here, if the data in ColumnText is written such way.

But since the beginning of the UPDATE-statement is hardwired with "UPDATE", I right now can't see a way to manipulate the statement to run SQL injection code.




N 56°04'39.16"
E 12°55'05.25"
Post #286696
Posted Monday, June 12, 2006 8:40 AM
SSC-Enthusiastic

SSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-EnthusiasticSSC-Enthusiastic

Group: General Forum Members
Last Login: Wednesday, February 18, 2009 7:48 AM
Points: 178, Visits: 4

I think it is worth mentioning the restrictions of that method such as:

- MAX number of columns (?),

- MAX total row length (8K).

I've used similar method using cursor instead of column table.




Post #286712
Posted Monday, June 12, 2006 3:40 PM
SSC Eights!

SSC Eights!SSC Eights!SSC Eights!SSC Eights!SSC Eights!SSC Eights!SSC Eights!SSC Eights!

Group: General Forum Members
Last Login: Monday, October 27, 2014 12:28 PM
Points: 945, Visits: 265
Perfect timing! I was able to use this logic for a report today. It made short work out of an otherwise arduous task.

Thanks.
Post #286863
Posted Tuesday, June 13, 2006 12:17 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, October 28, 2014 11:02 AM
Points: 2,397, Visits: 3,419
Max number of columns are restricted to what datatype you use for #Aggregate column. The total size for a row is 8,060 bytes. Using 60 bytes for RowText leaves us 8,000 bytes for the rest of the columns and since INT is 4 bytes, we can potentially have 2,000 columns. If you prefer SMALLINT (2 bytes) as #Aggregate column, you could theoretically have 4,000 columns.


N 56°04'39.16"
E 12°55'05.25"
Post #286905
« Prev Topic | Next Topic »

Add to briefcase 12345»»»

Permissions Expand / Collapse