Welcome to Sign in | Help
in Search

query sql

Last post 05-30-2009, 10:46 AM by rsocol. 3 replies.
Sort Posts: Previous Next
  •  05-28-2009, 10:47 AM 7222

    query sql

    Salut,
    Am urmatoarea situatie :

    Tabela X1 de forma
    t1 t2 t3
    2 7 12
    5 8 19
    7 5 21

    si vreau sa obtin o tabela X2 de forma

    name,value
    t1 max(valoare)
    t2 max(valoare)
    t3 max(valoare)

    precizez ca nu stiu nr de coloane din tabela T1, (t1..tn)

    Folosesc SQL Server 2008

    Multam




  •  05-28-2009, 11:27 AM 7224 in reply to 7222

    Re: query sql

    ce vrei tu pare a fi pivot dinamic
    http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server-2005-2008.aspx

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  05-30-2009, 10:01 AM 7237 in reply to 7224

    Re: query sql

    vezi clauza PIvot a comenzii select e disponibila inca din sql 2005 http://msdn.microsoft.com/en-us/library/ms177410.aspx
    Secolul XXI ori va fi religios ori nu va fi deloc
  •  05-30-2009, 10:46 AM 7238 in reply to 7222

    Re: query sql

    După câte înţeleg, ceea ce ai nevoie este un UNPIVOT dinamic.

    Presupunem că avem următoarea tabelă:

    CREATE TABLE X1 (

          t1 int,

          t2 int,

          t3 int

    )

     

    INSERT INTO X1 VALUES (2,7,12)

    INSERT INTO X1 VALUES (5,8,19)

    INSERT INTO X1 VALUES (7,5,21)

    Dacă am şti dinainte numele coloanelor, am putea rezolva problema cu un query de genul următor:

    SELECT 't1' as name, MAX([t1]) AS value FROM [x1]

    UNION ALL

    SELECT 't2' as name, MAX([t2]) AS value FROM [x1]

    UNION ALL

    SELECT 't3' as name, MAX([t3]) AS value FROM [x1]

    Însă neştiind numele coloanelor, trebuie să generăm acest query într-un mod dinamic (având grijă să evităm SQL Injection), folosind interogări pentru aggregate concatenation pe catalog views:

    DECLARE @TableName sysname, @SQL nvarchar(max)

    SET @TableName='X1'

    SET @SQL=STUFF((

          SELECT ' UNION ALL SELECT '+QUOTENAME(name,'''')

                +' as name, MAX('+QUOTENAME(name)

                +') AS value FROM '+QUOTENAME(@TableName)

          FROM sys.columns WHERE object_id=OBJECT_ID(@TableName) FOR XML PATH('')

    ),1,11,'')

    PRINT @SQL

    EXEC(@SQL)

     

    Răzvan

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems