2016-07-26 3 views
0

je tente cette requête SQL pour obtenir total actuel et aussi 2 derniers mois dossiers et enregistrement de mois en cours signifie 3 mois au total ..Dernière fiche 2 mois dans SQL

Select distinct 
tblRv.Owner, 
(Select Count(*) as total from tblvv WHERE MasterID =tblRv.ID and Name <> '') 
as currentdata 
from tblRe 
inner join tblRv 
On tblRe.RID = tblRv.RID 
WHERE 
tblRe.StartDate between dateadd(m, -2, getdate()) and getdate() and 
//tblRe.StartDate >= '2016-07-01 00:00:00' AND 
//tblRe.EndDate <= '2016-07-08 23:59:59' 
    and tblRe.Region = 'uk' and 
tblRv.Owner='Roh' 
order by tblRv.Owner 

quand j'exe cela me montrer comme ça

OwnerName  currentdata 
Roh    1 
Roh    2 
Roh    3 
Roh    5 

et quand je vérifie écrire individuellement requête et vérifier la date et 2016-07-01 todate 2016-07-30 dates puis cela me montrent les données 3 et 2016-06-01 00:00:00 et 2016-06-31 23:59:59 me montrent les données 1 et 2016-05-01 00:00:00, 2016-05-31 23:59:59 me montrent les données 0
donc je veux des données comme celui-ci

owner july june may 
roh 3  1 0 

aussi quand il y aura mois en cours par exemple, des données doivent août afficher 2 derniers mois iejune juillet

Répondre

0

Vous pouvez essayer de faire un requête pivot où les trois colonnes à pivoter sont le mois précédent, le mois précédent et le mois précédent précédent dans votre ensemble de données. Notez que j'ai dû réécrire votre requête pour supprimer les sous-requêtes de la clause SELECT, car cela rend impossible l'agrégation de ces colonnes.

SELECT tblRv.Owner, 
    SUM(CASE WHEN tblRe.StartDate = GETDATE() THEN t.total ELSE 0 END) AS currMonth, 
    SUM(CASE WHEN tblRe.StartDate = DATEADD(m, -1, GETDATE()) 
      THEN t.total ELSE 0 END) AS prevMonth, 
    SUM(CASE WHEN tblRe.StartDate = DATEADD(m, -2, GETDATE()) 
      THEN t.total ELSE 0 END) AS lastPrevMonth 
FROM tblRe 
INNER JOIN tblRv 
    ON tblRe.RID = tblRv.RID 
INNER JOIN 
(
    SELECT MasterID, COUNT(*) AS total 
    FROM tblvv 
    GROUP BY MasterID 
    WHERE Name <> '' 
) AS t 
    ON tblRv.ID = t.MasterID 
WHERE tblRe.StartDate BETWEEN DATEADD(m, -2, GETDATE()) AND GETDATE() AND 
     tblRe.Region = 'uk' AND 
     tblRv.Owner = 'Roh' 
GROUP BY tblRv.Owner 
ORDER BY tblRv.Owner 
+0

cette erreur show. Msg 130, niveau 15, état 1, ligne 4 Impossible d'exécuter une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête. – user6628729

+0

Syntaxe incorrecte près du mot clé 'WHERE'. – user6628729

+0

qu'est-ce que t après où – user6628729

0
Select 
     tblRv.Owner 
     ,DATENAME(MONTH,tblRe.StartDate) as [Month] 
     ,ISNULL(SUM(total),0) as currentdata 
from tblRe 
INNER JOIN tblRv ON tblRe.RID = tblRv.RID 
LEFT JOIN (
      Select Count(*) as total ,MasterID 
      from tblvv 
      WHERE Name <> '' 
      GROUP BY MasterID 
      ) tblvv 
ON tblvv.MasterID =tblRv.ID 
WHERE tblRe.StartDate >= DATEADD(MONTH, -2, GETDATE()) 
AND tblRe.EndDate <= GETDATE() 
AND tblRe.Region = 'uk' 
AND tblRv.[Owner] ='Roh' 
GROUP BY tblRv.Owner 
     ,DATENAME(MONTH,tblRe.StartDate) 
order by tblRv.[Owner] 
+0

this montrer rien .. seulement ce propriétaire de spectacle, mois, currentdata comme en-tête .. – user6628729

+1

@ user6628729 pouvez-vous configurer un violon sql? Il est vraiment difficile de dire à quoi ressemblent vos données et comment la requête doit être écrite. –

+0

Cela ne donnera pas la sortie désirée parce que vous n'avez pas pivoté, mais je suis d'accord avec le déplacement de la requête de comptage dans une jointure. –