2014-06-10 2 views
0

J'ai une instruction select SQL qui renvoie les enregistrements comme suit.Correction de valeurs répétées dans la requête de sélection SQL

Months | Output 
-------+------- 
Jan'13 | 10 
feb'13 | 12 
Mar'13 | 14 
Apr'13 | 15 
May'13 | 11 
Jun'13 | 14 

Maintenant, je veux la sortie de la requête comme suit.

Months | Output Quarter 
-------+--------------- 
Jan'13 | 10 1 
feb'13 | 12 1 
Mar'13 | 14 1 
Apr'13 | 15 2 
May'13 | 11 2 
Jun'13 | 14 2 

Pour chaque trois enregistrements de la sortie, j'ai besoin d'une valeur répétée comme ci-dessus.

+2

Quel est le type de données de la colonne 'de months'? – Uriil

+0

est de type Varchar @Uriil – user3383390

+0

Et trimestre prévu pour Jan'14, sera 1, correct? – Uriil

Répondre

0

Est-ce ce que vous cherchez?

select t.months, t.output, 
     ((row_number() over (order by months) + 2)/3) as quarter 
from (your query here) t 

Alternativement, vous voudrez peut-être l'option quarter-datepart(), mais vous n'avez pas assez d'informations dans la question d'expliquer comment faire cela.

+0

J'ai juste besoin d'un moyen de regrouper les mois en quarts pour être utilisés dans le rapport SSRS. J'ai donc pensé en répétant une seule valeur pour chaque trois enregistrements, je peux avoir une colonne qui peut être utilisée pour regrouper les enregistrements en quart. – user3383390

+0

Si vous souhaitez obtenir un trimestre dans SSRS, utilisez simplement la fonction DatePart (DateInterval.Quarter, ). Bien sûr, vous devez d'abord convertir la chaîne du mois en type DateTime. – qxg

+0

Lorsque j'utilise le code ci-dessus, les enregistrements sont regroupés par mois. et la sortie est comme 1 pour avril 13, avril 14 et avril et 2 pour août 13, août 14, août 15 ... – user3383390

0

réponse précédente compléter le (Gordon Linoff)

declare @TestTable table (months varchar(20), [output] int) 

insert into @TestTable 
values 
('Jan''13',  10), 
('feb''13',  12), 
('Mar''13',  14), 
('Apr''13',  15), 
('May''13',  11), 
('Jun''13',  14) 

SELECT 
    (ROW_NUMBER() OVER(order by ([output])) + 2)/3 AS 'quarter', 
    months, [output] 
FROM @TestTable 

Vous devez définir à droite ORDER BY pour vos données.

+0

Le calcul du trimestre doit être basé sur des mois, pas par sortie ... – Jesuraja

+0

Comme je l'ai dit, vous devez régler correctement ORDER BY. Je ne sais pas quel schéma de table vous avez. S'il y a un champ datetime alors commandez-le. Je mois est datetime (mais autre format) le convertir et ensuite trier par mois. Autre cas - faites en sorte que cet ordre soit correct. Vous pouvez même faire des sous-requêtes (comme le montre Gordon LInoff) – robertw

0

SQL suivante devrait fonctionner:

select Months, Output, DATEPART(Q, '1/' + SUBSTRING(Months, 1, 3) + '/' + SUBSTRING(Months, 5, 2)) as Quarter 

Cela crée une date de format '1 /' + monthname + '/' + année et obtenir le trimestre le domaine appartient.

1

Essayez la requête suivante:

INSERT INTO @TestTable 
VALUES 
     ('Jan''13', 10), 
     ('feb''13', 12), 
     ('Jun''13', 14), 
     ('Mar''13', 14), 
     ('Apr''13', 15), 
     ('May''13', 11) 

SELECT  months, [output], 
      DATEPART(QUARTER,REPLACE('1 ' + months,'''',' ')) AS Quarter 
FROM  @TestTable 
ORDER BY 3 -- Quarter 

format mois "mmm'yy" est converti en format "1 mmm yy". Par exemple: Jan'13 => 1 Jan 13 Ensuite, obtenez le quartier en utilisant DATEPART.

0

Peut être que ce serait utile:

mysql> SELECT FIND_IN_SET(LOWER(SUBSTRING(DATE_FORMAT(NOW(),'%y\'%b') , 4, 3)) ,'jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec') DIV 4 + 1 AS Quarter; 

+---------+ 
| Quarter | 
+---------+ 
|  2 | 
+---------+ 

(j'ai utilisé DATE_FORMAT(NOW(),'%y\'%b') au lieu de votre valeur Months ici)

0
DECLARE @TestTable table (months VARCHAR(10),output INT) 
INSERT INTO @TestTable 
VALUES 
     ('Jan''13', 10), 
     ('feb''13', 12), 
     ('Jun''13', 14), 
     ('Mar''13', 14), 
     ('Apr''13', 15), 
     ('May''13', 11) 

SELECT months, [output], CASE LEFT(REPLACE(months,'''',''),3) WHEN 'Jan' THEN 1 
      WHEN 'feb' THEN 1 
      WHEN 'Mar' THEN 1 
      WHEN 'Apr' THEN 2 
      WHEN 'May' THEN 2 
      WHEN 'Jun' THEN 2 
      END As Monthss 
FROM @TestTable 
ORDER BY DATEPART(QUARTER,REPLACE('1 ' + months,'''',' ')) ,3 
Questions connexes