2017-10-18 17 views
0

J'ai une table table1 qui a quelques colonnes, qui doit être calculée et déplacée dans une autre table table2 selon certaines conditions. Pour répondre aux conditions, j'ai créé une table temporaire #ttemp et modifié la table temporaire en créant deux nouvelles variables var1 et var2 pour définir des valeurs basées sur différentes colonnes et vérifier plus tard ces conditions. Si les conditions passent, je fais un peu d'agrégation et ensuite j'insérerais dans table2 qui aura des colonnes agrégées.Insérer des enregistrements dans une table avec une instruction IF d'un temp dans SQL Server 2016

D'abord, créez le tableau #temp et les variables de table1.

SELECT * 
INTO #ttemp 
FROM table1 

alter table #ttemp add var1 int 
alter table #ttemp add var2 int 

update #ttemp set var1 = -1 

update #ttemp set var1 = 1 
where error <> 0 and var1 = -1 

update #ttemp var2 = -1 

Ensuite, les valeurs de var1 colonne et var2 valeurs colonnes de la table #temp (var1 = 0 et var2 = -1) et calculer la moyenne des cus_request, cus_stay et les mettre dans une nouvelle table temporaire #ttemp2.

IF var2 = -1 and var1 = 0 
    BEGIN 
    select y.id, y.avg(cus_request) as r_avg, y.avg(cust_stay) as s_avg 
    INTO #ttemp2 
    FROM #ttemp as y 

    UPDATE l 
    SET l.cus_request_avg = t.r_avg, l.cust_stay_avg = t.s_avg 
    FROM table2 as l 
    inner join #ttemp2 as t 
    t.id = l.id 

END 

Mon problème est, mon instruction IF ne fonctionne pas et si je viens de lancer les déclarations select et update déclaration, il fonctionne très bien, mais après la déclaration de mise à jour, j'obtenir 0 rows affected que les conditions ne se rencontrent pas. J'utilise update au lieu de insert déclaration. Comment insérer des enregistrements dans table2?

Toute aide aurait apprécié.

+0

Où est votre BEGIN? –

+0

Pouvez-vous poster la requête complète? Je ne comprends pas vraiment comment votre FI s'intègre. Avec un IF, vous voulez comparer une valeur, pas une colonne. Ce que vous avez fait là pourrait être réalisé par une clause WHERE j'imagine. – Leonidas199x

+0

@ Leonidas199x Je compare les valeurs de ces colonnes 'var1' et' var2'. Je suis un novice dans SQL Server. Voulez-vous dire que je peux définir la comparaison de valeur 'var1' et' var2' dans la clause 'where'? –

Répondre

1

Je pense que vous utilisez abusivement IF. IF compare deux valeurs, ne regarde pas deux colonnes et sélectionne les données dans lesquelles les conditions sont remplies.

Je pense que vous pouvez réaliser ce que vous êtes après avec une clause WHERE:

SELECT avg(y.cus_request) AS r_avg, avg(y.cust_stay) AS s_avg 
    INTO #ttemp2 as t2 
    FROM #ttemp as y 
    WHERE y.var2 = -1 AND y.var1 = 0 

    UPDATE l 
    SET l.cus_request_avg = t.r_avg, 
     l.cust_stay_avg = t.s_avg 
    FROM table2 as l 
    inner join #ttemp2 as t ON t.id = l.id 

Pour répondre à la question dans les commentaires ....

Pour insérer simplement dans la table, il est:

INSERT INTO table2 
     (
      cus_request_avg , 
      cust_stay_avg 
     ) 
SELECT  t.r_avg   , 
      t.s_avg 
FROM  #ttemp2  AS t; 

Pour insérer uniquement lorsque les enregistrements n'existent pas dans table2:

INSERT INTO table2 
     (
      cus_request_avg , 
      cust_stay_avg 
     ) 
SELECT  t.r_avg   , 
      t.s_avg 
FROM  #ttemp2  AS t 
LEFT JOIN table2  AS l ON t.id = l.id 
WHERE  l.id IS NULL; 
+0

J'étais sur le point de modifier ma question à partir des commentaires ci-dessus, mais je pourrais éditer en mots, pas dans mon code autant que c'est à peu près ce que j'avais. Laisse-moi essayer ça. Cela pourrait être le chemin à parcourir! –

+0

@ i.n.n.m ont apporté quelques modifications, l'aliasing avait besoin d'un peu d'attention. – Leonidas199x

+0

Oui, mon erreur - excuses. Qu'est-ce que vous joignez # ttemp2 à table2? – Leonidas199x