Welcome to Sign in | Help
in Search

interogare - cum sa?

Last post 04-14-2009, 4:07 PM by adim. 3 replies.
Sort Posts: Previous Next
  •  04-13-2009, 5:26 PM 7053

    interogare - cum sa?

    Salut.
    Am un tabel cu urmatoarele campuri: timp, parametru, valoare. Recordurile din tabel vor fi de forma:

    id     timp    param.  val.
    1. 00:00:00 param1 20
    2. 00:00:00 param2 15
    3. 00:00:00 param3 12
    4. 00:01:00 param1 47
    5. 00:01:00 param2 26
    6. 00:01:00 param3 32
    7. 00:02:00 param1 65
    8. 00:02:00 param2 67
    9. 00:02:00 param3 98

    si tot asa. La fiecare minut, cei 3 parametri sunt salvati in tabel cu valoarea din acel minut.
    Problema e ca vreau sa obtin cu o interogare un recordset de forma:

    id     timp    val. param1 val. param2 val. param3
    1. 00:00:00       20               15               12
    2. 00:01:00       47               26               32
    3. 00:02:00       65               67               98

    Se poate face chestia asta?

    Multam de ajutor.
  •  04-13-2009, 7:46 PM 7054 in reply to 7053

    Re: interogare - cum sa?

    N-ar fi stricat să precizezi şi versiunea de SQL Server utilizată.

    Încearcă:
    SELECT [timp],
    MAX(CASE WHEN [param.] = 'param1' THEN [val.] ELSE 0 END) AS [val. param1],
    MAX(CASE WHEN [param.] = 'param2' THEN [val.] ELSE 0 END) AS [val. param2],
    MAX(CASE WHEN [param.] = 'param3' THEN [val.] ELSE 0 END) AS [val. param3]
    FROM [tabel]
    GROUP BY [timp]

  •  04-13-2009, 7:52 PM 7055 in reply to 7053

    Re: interogare - cum sa?

    Dacă foloseşti SQL Server 2005 sau 2008, poţi folosi operatorul PIVOT, astfel:

    CREATE TABLE tabel (

          id int PRIMARY KEY,

          timp time NOT NULL,

          param varchar(50) NOT NULL,

          val int NOT NULL,

          UNIQUE (timp, param)

    )

     

    INSERT INTO tabel VALUES

    (1,'00:00:00','param1',20),

    (2,'00:00:00','param2',15),

    (3,'00:00:00','param3',12),

    (4,'00:01:00','param1',47),

    (5,'00:01:00','param2',26),

    (6,'00:01:00','param3',32),

    (7,'00:02:00','param1',65),

    (8,'00:02:00','param2',67),

    (9,'00:02:00','param3',98)

     

    SELECT ROW_NUMBER() OVER (ORDER BY timp) AS id, timp,

          param1, param2, param3

    FROM (SELECT timp, param, val FROM tabel) t

    PIVOT (SUM(val) FOR param IN (param1,param2,param3)) p


    (crearea tabelei şi inserarea datelor e făcută cu sintaxa specifică SQL Server 2008, dar SELECT-ul funcţionează şi în SQL Server 2005).


    Dacă ai SQL Server 2000, atunci poţi folosi ceva de genul:


    SELECT (SELECT COUNT(DISTINCT b.timp) FROM tabel b WHERE b.timp<=a.timp) AS id,

          timp,

          SUM(CASE WHEN param='param1' THEN val ELSE 0 END) AS param1,

          SUM(CASE WHEN param='param2' THEN val ELSE 0 END) AS param2,

          SUM(CASE WHEN param='param3' THEN val ELSE 0 END) AS param3

    FROM tabel a GROUP BY timp


    Răzvan
  •  04-14-2009, 4:07 PM 7057 in reply to 7055

    Re: interogare - cum sa?

    Merg toate variantele. E vorba de 2005 Express.
    Multumesc mult.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems