2
votes

T-SQL - Copie et transposition de données

J'essaye de copier des données d'une table à une autre, tout en les transposant et en les combinant en lignes appropriées, avec différentes colonnes dans la deuxième table.

Première publication. Oui, cela peut sembler simple à tout le monde ici. J'ai essayé pendant quelques heures de résoudre ce problème. Je n'ai pas beaucoup de soutien en interne et j'ai beaucoup appris sur ce forum et j'ai réussi à être tellement accompli avec vos autres exemples d'aide. J'apprécie toute aide avec cela.

Le tableau 1 contient les données dans ce format.

Date  First Second
------------------
2019    1     3
2020    2     4

Le tableau 2 contient déjà les lignes Date remplies et les colonnes créées. Il attend que les valeurs du tableau 1 soient placées dans la colonne / ligne appropriée.

Type    Date  Value
--------------------
First   2019  1
First   2020  2
Second  2019  3
Second  2020  4


1 commentaires

Vous pouvez utiliser la fonction string_agg


4 Réponses :


1
votes

Vous pouvez faire une agrégation conditionnelle:

with cte as (
     select date, 
            max(case when type = 'first' then value end) as first,
            max(case when type = 'Second' then value end) as Second
     from table t
     group by date
)

update t2
      set t2.First = t1.First,
          t2.Second = t1.Second
from table2 t2 inner join
     cte t1
     on t1.date = t2.date;

Après cela, vous pouvez utiliser cte :

select date, 
       max(case when type = 'first' then value end) as first,
       max(case when type = 'Second' then value end) as Second
from table t
group by date;


1 commentaires

Cela a également fonctionné. Merci beaucoup. J'ai abandonné un vote mais je suis trop nouveau pour qu'il soit visible.



1
votes

utiliser l'agrégation conditionnelle

select date,max(case when type='First' then value end) as First,
       max(case when type='Second' then value end) as Second  from t
   group by date


1 commentaires

est-ce la même chose que ce que fait pivot @Zaymul



1
votes

Pour une mise à jour, je pourrais utiliser deux joins :

update  t2
    set first = tf.value,
        second = ts.value
    from table2 t2 left join
         table1 tf
         on t2.date = tf.date and tf.type = 'First' left join
         table1 ts
         on t2.date = ts.date and ts.type = 'Second'
    where tf.date is not null or ts.date is not null;


2 commentaires

Cela a fonctionné. Merci beaucoup. J'ai abandonné un vote mais je suis trop nouveau pour qu'il soit visible.


@MichaelStewart. . . Vous devez choisir la réponse qui vous semble la meilleure et accepter la réponse. Le PO peut toujours accepter une réponse, quelle que soit sa réputation.



0
votes

On dirait que vous recherchez un PIVOT

 DECLARE @Table1 TABLE
    (
        [Type] NVARCHAR(100)
      , [Date] INT
      , [Value] INT
    );

DECLARE @Table2 TABLE(
[Date] int
,[First] int
,[Second] int
)

INSERT INTO @Table1 (
                          [Type]
                        , [Date]
                        , [Value]
                      )
VALUES ( 'First', 2019, 1 )
     , ( 'First', 2020, 2 )
     , ( 'Second', 2019, 3 )
     , ( 'Second', 2020, 4 );

INSERT INTO @Table2 (
                        [Date]
                    )
VALUES (2019),(2020)

--Show us what's in the tables
SELECT * FROM @Table1
SELECT * FROM @Table2

--How to pivot the data from Table 1 
SELECT * FROM   @Table1
    PIVOT (
              MAX([Value]) --Pivot on this Column
              FOR [Type] IN ( [First], [Second] ) --Make column where [Value] is in one of this
          ) AS [pvt] --Table alias

--which gives
--Date        First       Second
------------- ----------- -----------
--2019        1           3
--2020        2           4

--Using that we can update @Table2
UPDATE [tbl2]
SET [tbl2].[First] = pvt.[First]
    ,[tbl2].[Second] = pvt.[Second]
FROM   @Table1 tbl1
    PIVOT (
              MAX([Value]) --Pivot on this Column
              FOR [Type] IN ( [First], [Second] ) --Make column where [Value] is in one of this
          ) AS [pvt] --Table alias
INNER JOIN @Table2 tbl2 ON [tbl2].[Date] = [pvt].[Date]

--Results from @Table 2 after updated
SELECT * FROM @Table2

--which gives
--Date        First       Second
------------- ----------- -----------
--2019        1           3
--2020        2           4


2 commentaires

Cela a fonctionné et c'était une explication incroyable. Merci beaucoup. J'ai abandonné un vote mais je suis trop nouveau pour qu'il soit visible.


@MichaelStewart De rien. Choisissez simplement la réponse qui vous semble la meilleure et acceptez-la, cochez la case à côté de la réponse. Le PO peut toujours accepter une réponse, quelle que soit sa réputation.