2009-09-25 9 views
0

Comment puis-je obtenir ce résultat avec une requête de modification ci-dessous.SELECT multirow avec une requête (mais modifié s'il vous plaît)

foo 
01 
02 
03 

    declare @a as int 
    set @a = 1 

    select single.* from 
    (select 
    case 
    when 0=0 then '0'+ 
     case 
     when @a = 1 then '1' 
     when @a = 2 then '2' 
     when @a = 3 then '3' 
     end 
    end 
    as foo) single 
    cross join 
    (select 1 as bir union all select 2 union all select 3) multi 

Comme vous l'avez vu, je dois écrire d'abord « 1 » puis a = a + 1 en boucle (dans tous les « quand » déclaration)

PS: J'ai une grande requête et j'ai besoin d'écrire chaque ligne trois fois, mais avec quelques modifications. (je dois changer 2 dernières lignes de « A0 » à « ** » sous la sortie -Dernière par colonnes)

TR13 BA20 1143 2009-08-31 2009-08-31 ***615134 TR74063001 40 1937,52 A0 
    TR13 BA20 1143 2009-08-31 2009-08-31 ***615134 TR74063001 50 1937,52 ** 
    TR13 BA20 1143 2009-08-31 2009-08-31 ***615134 TR74063001 50 1937,52 ** 
+0

Je ne sais pas si je suivais correctement votre logique, voir ma réponse et faites-moi savoir si ça aide –

Répondre

1

Je vais être honnête avec vous: Je ne sais pas quel est le but de la requête dans la question. La seule chose évidente est la futilité de la plupart de celui-ci. Toutefois, si je comprends bien votre question, vous avez un ou plusieurs enregistrements dans un tableau sur la base duquel vous souhaitez générer un jeu de résultats contenant trois copies de chaque enregistrement mais avec de légères modifications à chaque copie. Donc, si vous avez quelque chose comme:

SourceTable 
--------|---------|---------|--------| 
field1 | filed2 | filed3 | field4 | 
--------|---------|---------|--------| 
    TR13 | BA20 | 2009-08 | A0  | 
    TR14 | BA21 | 2009-08 | A1  | 
    TR15 | BA22 | 2009-08 | A2  | 
    TR16 | BA23 | 2009-08 | A3  | 

Et vous voulez obtenir ceci:

TR13 | BA20 | 2009-08 | A0  | 
    TR13 | BA20 | 2009-08 | **  | 
    TR13 | BA20 | 2009-08 | **  | 
    TR14 | BA21 | 2009-08 | A1  | 
    TR14 | BA21 | 2009-08 | **  | 
    TR14 | BA21 | 2009-08 | **  | 
    TR15 | BA21 | 2009-08 | A2  | 
    TR15 | BA21 | 2009-08 | **  | 
    TR15 | BA21 | 2009-08 | **  | 
    TR16 | BA23 | 2009-08 | A3  | 
    TR16 | BA23 | 2009-08 | **  | 
    TR16 | BA23 | 2009-08 | **  | 

Ensuite, vous pouvez écrire votre requête comme ceci:

select SourceTable.field1 
     , SourceTable.field2 
     , SourceTable.field3 
     , case when multi.bir = 1 then SourceTable.field4 else '**' end 
    from SourceTable 
    cross join 
    (select 1 as bir union all select 2 union all select 3) multi 
+0

Je n'ai besoin que de 3 lignes. Dans ma sortie j'ai besoin de changer dans les dernières colonnes de la dernière ligne à "**". – uzay95

+0

Quelle est exactement la requête que vous avez? Je ne comprends toujours pas ce que vous essayez de faire ou où est exactement la difficulté .. –

+0

@Miky D: votre réponse à 100 pour cent à droite. Merci beaucoup. – uzay95

0

Vous pouvez créer une variable de table une colonne et insérez 1,2,3 dans celui-ci, puis OUTER le joindre à vos données, puis utilisez votre déclaration de cas.

quelque chose comme:

DECLARE @onetwothree table (
    num nvarchar(2) 
) 
INSERT into @onetwothree (num) VALUES ('01') 
INSERT into @onetwothree (num) VALUES ('02') 
INSERT into @onetwothree (num) VALUES ('03') 

SELECT YourBigQuery.*, OneTwoThree.num 
FROM YourBigQuery, @onetwothree AS OneTwoThree 

avec la déclaration de cas:

DECLARE @onetwothree table (
    num tinyint 
) 
INSERT into @onetwothree (num) VALUES (1) 
INSERT into @onetwothree (num) VALUES (2) 
INSERT into @onetwothree (num) VALUES (3) 

SELECT YourBigQuery.*, (
     CASE OneTwoThree.num 
     WHEN 1 THEN YourBigQuery.YourLastColumn 
     ELSE '**' 
     END 
    ) 
FROM YourBigQuery, @onetwothree AS OneTwoThree 
+0

Cela ne soit pas le résultat que je veux. Ai-je tort? – uzay95

+0

L'exemple le plus haut était ma tentative de répondre à votre question initiale. La deuxième partie (je viens d'ajouter) est plus pratiquement ce que vous vouliez. – Toby

0

Presque même avec la réponse MikyDs .

declare @a as int 
    set @a = 1 

    select 
     case 
     when multi.bir <> 1 then '**' 
     else single.foo 
     end   
    from 
    (select 
    case 
    when 0=0 then '0'+ 
      case 
      when @a = 1 then '1' 
      when @a = 2 then '2' 
      when @a = 3 then '3' 
      end 
    end 
    as foo) single 
    cross join 
    (select 1 as bir union all select 2 union all select 3) multi 

Résultat:

(No column name) 
01 
** 
** 
Questions connexes