2009-05-18 5 views
0

Hallo iam mit zwei Tabellen zu schreiben, und ich brauche die Werte in eine temporäre Tabelle einfügen nach der Zählung alsWie eine Bedingung in SQL mit dem COUNT Wert

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 

wo @count gleich sein sollte, wählen Sie (name) aus test_table2 Gruppe zählen namentlich die eine Gruppe von Spalten und @count kehrt sollte eine Spalte Wert zu einem Zeitpunkt

+2

BITTE NICHT IN ALLE CAPS SCHREIBEN –

+2

Das ist der Codierungsstil für SQL – thecoop

+0

Ein paar Reihen von Beispieldaten in test_table1 und test_table2, mit ein paar Zeilen der Wunschausgabe würde die Frage stellen (vermutlich möchten Sie all dies tun in eine einzige Abfrage?) klarer. – araqnid

Antwort

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

Hier ist noch eine andere Art und Weise nehmen. Wenn die Idee anders den Namen auf Basis ist angezeigt, ob es Duplikate sind in TestTable2, dann wird diese Arbeit:

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: Wenn auf der anderen Seite, ist die Absicht, die Anzeige des Namen zu ändern, dass nur wenn es werden IDs in der TestTable2 passend, dies funktionieren wird, und es ist sehr einfach:

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

ich einige Testdaten wie folgt erstellt:

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

Und schrieb eine Abfrage:

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 

, dass diese produziert:

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

ich Sie m.name statt n.name in Ihrem "else" Zweig gemeint haben könnte denken?

Ich bin raten (und deshalb Beispielausgabe nützlich gewesen wäre) von Ihrem „@count sollte eine Spalte Wert zu einer Zeit“, die Sie benötigen @count von der Anzahl der Zeilen zu erwachse Jeder Name in test_table2.

Ich glaube, die Ausgabe dieser Abfrage ist, was Sie in Ihre temporäre Tabelle gehen möchten: In diesem Fall, Präfix es mit "Einfügen in #temp_cols".

+0

Vielen Dank Ihre Abfrage hat mir sehr geholfen –