none
Requête SQL server RRS feed

  • Question

  • Bonjour,

    Je cherche un moyen de faire une requête sur SQL Server 2000 avec des tables relativements grande. J'explique:

    TAB1

    Id               TypeId        StationId      DataValue
    1                    1                 1               0.113
    2                    1                 2               0.344
    3                    1                 3               0.274
    ...
    ...
    500                 2                 1               0.197
    501                 2                 2               0.397
    502                 2                 3               0.311

    ...
    ...
    1000000         35                900            0.872



    Je cherche à faire une requête qui me permetterait d'obtenir une table semblable à:

    StationId    TypeId1    TypeId2    TypeId3 ...  ...    TypeId35        
         1             0.113        0.197       xxx                     xxx
         2             0.344        0.397       xxx                     xxx
         3             0.274        0.311       xxx                     xxx
    ...
    ...
        900           xxx            xxx        xxx                    0.872       


    Y a-t-il un moyen de faire cette requete sans passer par un grand nombre de jointures de table, qui rendent la requête interminable??
    Merci
    mardi 29 décembre 2009 16:33

Réponses

  • suivant l'exemple...

    -- déclarées table temporaire
    declare @tab1 table(Id int,TypeId int, StationId int, DataValue numeric(10,3))
    
    -- peupler table
    insert @tab1
    select 1,1,1,0.113 union
    select 2,1,2,0.344 union
    select 3,1,3,0.274 union
    -- ...
    -- ...
    select 500,2,1,0.197 union
    select 501,2,2,0.397 union
    select 502,2,3,0.311 union
    -- ...
    -- ...
    select 1000000,35,900,0.872
    
    -- simulant pivot dans SQL 2000
    select 
        StationId,
        TypeId1  = max(case TypeId when 1 then DataValue else null end),
        TypeId2  = max(case TypeId when 2 then DataValue else null end),
        TypeId3  = max(case TypeId when 3 then DataValue else null end),
    
    --... résumant	
    
        TypeId35 = max(case TypeId when 35 then DataValue else null end)
    from 
        @tab1
    group by 
        StationId
    order by 
        StationId
    
    /*
    StationId   TypeId1    TypeId2       TypeId3      TypeId35
    ----------- ---------- ------------- ------------ -------------
    1           0.113      0.197         NULL         NULL
    2           0.344      0.397         NULL         NULL
    3           0.274      0.311         NULL         NULL
    900         NULL       NULL          NULL         0.872
    
    (4 linha(s) afetadas)
    */

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Proposé comme réponse Leonardo Marcelino mercredi 30 décembre 2009 02:17
    • Marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:33
    • Non marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:34
    • Non proposé comme réponse Franky0080 mercredi 30 décembre 2009 19:34
    • Marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:37
    mercredi 30 décembre 2009 02:17

Toutes les réponses

  • suivant l'exemple...

    -- déclarées table temporaire
    declare @tab1 table(Id int,TypeId int, StationId int, DataValue numeric(10,3))
    
    -- peupler table
    insert @tab1
    select 1,1,1,0.113 union
    select 2,1,2,0.344 union
    select 3,1,3,0.274 union
    -- ...
    -- ...
    select 500,2,1,0.197 union
    select 501,2,2,0.397 union
    select 502,2,3,0.311 union
    -- ...
    -- ...
    select 1000000,35,900,0.872
    
    -- simulant pivot dans SQL 2000
    select 
        StationId,
        TypeId1  = max(case TypeId when 1 then DataValue else null end),
        TypeId2  = max(case TypeId when 2 then DataValue else null end),
        TypeId3  = max(case TypeId when 3 then DataValue else null end),
    
    --... résumant	
    
        TypeId35 = max(case TypeId when 35 then DataValue else null end)
    from 
        @tab1
    group by 
        StationId
    order by 
        StationId
    
    /*
    StationId   TypeId1    TypeId2       TypeId3      TypeId35
    ----------- ---------- ------------- ------------ -------------
    1           0.113      0.197         NULL         NULL
    2           0.344      0.397         NULL         NULL
    3           0.274      0.311         NULL         NULL
    900         NULL       NULL          NULL         0.872
    
    (4 linha(s) afetadas)
    */

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Proposé comme réponse Leonardo Marcelino mercredi 30 décembre 2009 02:17
    • Marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:33
    • Non marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:34
    • Non proposé comme réponse Franky0080 mercredi 30 décembre 2009 19:34
    • Marqué comme réponse Franky0080 mercredi 30 décembre 2009 19:37
    mercredi 30 décembre 2009 02:17
  • Merci pour la réponse.

    Cela fonctionne parfaitement, mais je me demande quelle est l'utilité de créer une table temporaire, car le tout fonctionne très bien directement lors du SELECT de la table source.
    mercredi 30 décembre 2009 19:37
  • merci pour les commentaires.

    La table temporaire était d'illustrer l'exemple.


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    jeudi 31 décembre 2009 10:16