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
4 Réponses :
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;
Cela a également fonctionné. Merci beaucoup. J'ai abandonné un vote mais je suis trop nouveau pour qu'il soit visible.
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
est-ce la même chose que ce que fait pivot @Zaymul
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;
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.
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
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.
Vous pouvez utiliser la fonction string_agg