2009-05-18 7 views
0

Hi iam ayant deux tables et je besoin d'insérer les valeurs dans une table temporaire selon le nombre queComment écrire une condition dans SQL en utilisant la valeur COUNT

IF(@COUNT>1) 
BEGIN 
insert into #temp_cols 
SELECT M.ID_PK, 
substring(M.NAME,1,1)+'_'+ N.NAME 
FROM TEST_TABLE1 M WITH (NOLOCK) 
LEFT JOIN TEST_TABLE2 N ON M.ID_PK=N.ID_FK 
END 

ELSE 
BEGIN 
insert into #temp_cols 
SELECT M.ID_PK, 
N.NAME 
FROM TEST_TABLE1 M WITH (NOLOCK) 
LEFT JOIN TEST_TABLE2 N ON M.ID_PK=N.ID_FK 
END 

où @count doit être égale à sélectionner count (nom) du groupe test_table2 par nom qui renvoie un groupe de colonnes et @count devrait prendre une valeur de colonne à la fois

+2

S'IL VOUS PLAÎT NE PAS ÉCRIRE EN MAJUSCULES –

+2

Cest le style de codage pour SQL – thecoop

+0

Quelques lignes de données d'exemple dans test_table1 et test_table2, avec quelques lignes de sortie de désir rendrait la question (sans doute que vous voulez faire tout cela dans une seule requête?) plus claire. – araqnid

Répondre

0
IF EXISTS (select count(name) from test_table2 group by name HAVING count(name) > 1) 
BEGIN 
    insert into #temp_cols 
    SELECT M.ID_PK, 
    substring(M.NAME,1,1)+'_'+ N.NAME 
    FROM TEST_TABLE1 M WITH (NOLOCK) 
    LEFT JOIN TEST_TABLE2 N ON M.ID_PK=N.ID_FK 
END 

ELSE 
BEGIN 
    insert into #temp_cols 
    SELECT M.ID_PK, 
    N.NAME 
    FROM TEST_TABLE1 M WITH (NOLOCK) 
    LEFT JOIN TEST_TABLE2 N ON M.ID_PK=N.ID_FK 
END 
1

Voici encore une autre façon. Si l'idée est d'afficher le nom différemment selon qu'il existe des doublons dans TestTable2, cela fonctionnera:

DECLARE @Count int 
SELECT @Count = COUNT(name) FROM test_table2 GROUP BY name HAVING COUNT(name) > 1 

INSERT INTO #temp_cols 
SELECT 
    M.ID_PK, 
    CASE 
     WHEN @Count > 1 THEN SUBSTRING(M.NAME, 1, 1) + '_' + N.NAME 
     ELSE N.Name 
    END,  
FROM TEST_TABLE1 M WITH (NOLOCK) 
    LEFT JOIN TEST_TABLE2 N ON M.ID_PK = N.ID_FK 

EDIT: Si d'autre part, l'intention est de changer l'affichage du nom seulement quand il y a des ID correspondant dans la TestTable2, cela fonctionne et il est très simple:

INSERT INTO #temp_cols 
SELECT 
    M.ID_PK, 
    ISNULL(SUBSTRING(M.NAME, 1, 1) + '_' + N.NAME, M.Name) As Name 
FROM TEST_TABLE1 M WITH (NOLOCK) 
    LEFT JOIN TEST_TABLE2 N ON M.ID_PK = N.ID_FK 
1

J'ai créé quelques données de test comme celui-ci:

id_pk | name | id_fk | name 
-------+------+-------+-------- 
    1 | foo |  1 | jingle 
    1 | foo |  1 | jangle 
    2 | bar |  2 | jangle 
    3 | quux |  | 

Et a écrit une requête:

select m.id_pk, case when groupcount.name_count > 1 then substring(m.name, 1, 1) + '_' + n.name else m.name end 
from test_table1 m 
    left join test_table2 n on m.id_pk = n.id_fk 
    left join (select name, count(name) as name_count from test_table2 group by name) groupcount on n.name = groupcount.name 

qui produit ceci:

id_pk | name 
-------+---------- 
    1 | foo 
    1 | f_jangle 
    2 | b_jangle 
    3 | quux 

Je pense que vous pourriez avoir signifié m.name plutôt que n.name dans votre branche "else"?

Je suis deviner (et c'est pourquoi l'exemple de sortie aurait été utile) à partir de votre "@count devrait prendre une valeur de colonne à la fois" que vous devez déduire @count du nombre de lignes pour chaque nom dans test_table2. Je crois que la sortie de cette requête est ce que vous voulez aller dans votre table temporaire: dans ce cas, préfixez-le avec "insérer dans #temp_cols".

+0

Merci beaucoup votre requête m'a beaucoup aidé –

Questions connexes