2010-07-20 7 views
3

J'ai un varchar table unique, int, int comme ceci:Générer des lignes avec index entre deux nombres

OS   MinSP  MaxSP 
--   -----  ----- 
2000  4   4 
XP   2   3 
Vista  0   2 
7   0   1 

Ce que je veux est une question qui va générer une liste de valeurs comme ceci:

  • 2000 SP4
  • XP SP2
  • XP SP3
  • Vista
  • Vista SP1
  • Vista SP2
  • 7 SP1

Modifier

Bien que MinSP et MaxSP un jamais plus d'une part dans mon exemple original, il est possible qu'ils les deux sont identiques ou séparés par plus d'un. J'ai changé l'exemple pour illustrer.

+1

si le minVersion n'est pas 1 étape inférieure à la maxVersion? – Tobiasopdenbrouw

+0

Désolé, j'aurais dû être plus précis à ce sujet, va éditer la question. – robertc

+0

Voulez-vous une requête pure ('cause, ew), ou l'appel d'une procédure stockée comme Tobiasopdenbrow suggéré être acceptable? – LittleBobbyTables

Répondre

1

Vous auriez besoin d'un Tally table faire la suivant, mais il bat un curseur et se développera dynamiquement avec le prochain OS qui est publié. Votre table de pointage devra également être zéro.

EDIT: Correction d'une faute de frappe et a ajouté une deuxième version

Version 1 (Vous n'avez pas Tally tableau): Cela génère une table de nombres à la volée en utilisant sys.all_columns. Il y a plusieurs façons de le faire, mais vous avez l'idée.

;WITH Tally(N) 
      AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 --minus one to make this zero based 
       FROM  sys.all_columns C) 
    SELECT OS + CASE WHEN N > 0 THEN ' SP' + CAST(B.N AS char(1)) 
         ELSE '' 
       END 
    FROM dbo.Test A 
    INNER JOIN Tally B ON B.N >= A.MinSp 
          AND B.N <= A.MaxSp 

version deux (Vous avez un Tally tableau qui est de base zéro):

SELECT OS + CASE WHEN N > 0 THEN ' SP' + CAST(B.N AS char(1)) 
        ELSE '' 
      END 
FROM dbo.Test A 
INNER JOIN dbo.Tally B ON B.N >= A.MinSp 
          AND B.N <= A.MaxSp 
1

réponse rapide:

Select OS + ' SP' + Convert(varchar(50),MinSp) as col1 from TABLE 
UNION 
Select OS + ' SP' + Convert(varchar(50),MaxSp) as col1 from TABLE 

Ajouter ORDER BY comme on le souhaite.

Mais voir aussi mon commentaire à votre question.

+0

Merci, comme vous le supposez mon exemple n'a pas pleinement illustré toutes les possibilités, j'ai édité la question en conséquence. – robertc

+0

@robertc Dans ce cas, et en supposant le seul incrément de SP dans les entiers entiers, je créer une procédure stockée qui combine les étapes suivantes: 1. Itérer sur votre table d'entrée (curseur), et pour chaque ligne: 2 Tirez une boucle For sur la plage MaxSP-MinSP (0,1,2 dans votre rangée 'Vista') et pour chaque étape de la boucle créez la chaîne correcte dans une table (temp) (test pour '0' pour créer le chaîne correcte) 3. Sortie de la table temporaire – Tobiasopdenbrouw

1
SELECT CASE WHEN MinSP = '0' THEN OS ELSE OS + ' SP' + cast(MinSP as 
    nvarchar(10)) END AS Results, MaxSP 
FROM OS 

UNION 

SELECT CASE WHEN MaxSP = '0' THEN OS ELSE OS + ' SP' + cast(MaxSP as 
    nvarchar(10)) END AS Results, MaxSP 
FROM OS 
ORDER BY MaxSP DESC 

EDIT:

Et avec vos nouveaux critères, je suis supposé que vous aurez une deuxième table appelée SPNums, qui est rempli avec autant de numéros que vous pensez que vous aurez besoin, à commencer par 0.

SPNum 
----- 
    0 
    1 
    2 
    3 
    4 
    5 
    6 

Et puis la requête:

SELECT CASE WHEN SPNum = '0' THEN OS ELSE OS + ' SP' + cast(SPNum as 
    nvarchar(10)) END AS Results 
FROM OS 
LEFT OUTER JOIN SPNums ON SPNum >= MinSP AND SPNum <= MaxSP 
ORDER BY OS 
+0

Ah oui, la version 0 supprime la balise 'SP'. Bon point. Encore, l'OP devrait considérer le scénario où maxsp <> minsp + 1. – Tobiasopdenbrouw

+0

Bon point, et je suis absolument d'accord. – LittleBobbyTables

+0

Merci pour votre réponse, j'ai édité la question suivant le commentaire de Tobiasopdenbrouw – robertc

Questions connexes