2012-10-12 3 views
1
declare @temp table (ddate datetime) 

insert @temp 
select DATEDIFF(d,0,CONVERT(smalldatetime,'09/30/2012') -Number) 
from master..spt_values 
where type='p' and number < DatePart(d,'09/30/2012') 
order by 1 

DECLARE @DeptCode int =1 

- à l'affichage des données de date particulièrecombiner aujourd'hui et total précédent d'aujourd'hui que les mêmes résultats de colonne dans une requête SQL

select ComplaintMedia_Abbri, 
ddate,COUNT(ComplaintMedia) as c 
from Complaint 
INNER JOIN @temp 
ON convert(datetime,convert(varchar(10),ComplaintDate,101),101)=convert(datetime,convert(varchar(10),ddate,101),101)   
WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
group by ComplaintMedia_Abbri,ddate 
order by ddate,ComplaintMedia_Abbri 

- pour afficher jusqu'à ce jour date particulière fonctionnement des données au total

select ComplaintMedia_Abbri,ddate, 
    COUNT(ComplaintMedia_Abbri) as c 
    from Complaint 

    INNER JOIN @temp 
    ON convert(datetime,convert(varchar(10),ComplaintDate,101),101)<=convert(datetime,convert(varchar(10),ddate,101),101)  

    WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
    group by ComplaintMedia_Abbri,ddate 

Je veux montrer les enregistrements dans un des résultats de la requête sql totale jusqu'à ce jour et aujourd'hui (ce jour) en cours d'exécution .....

à la jointure, il existe deux conditions de différence.

résultat attendu devrait être ressembler à ceci

expected result for above query

Edit: Je suis en mesure de achive ce résultat en utilisant ces requêtes et les rejoindre, mais je veux faire cette tâche en une seule requête au lieu de deux requêtes

mon chemin actuel peut être vérifier ici. désolé pour cette longue question, mais je pense qu'il est nécessaire de comprendre la question en fait ..

declare @temp table (ddate datetime) 

insert @temp 
select DATEDIFF(d,0,CONVERT(smalldatetime,'09/30/2012') -Number) 
from master..spt_values 
where type='p' and number < DatePart(d,'09/30/2012') 
order by 1 

--select * from @temp 

SELECT * FROM 

     (select ddate,ISNULL(L,0) AS Letter, 
      ISNULL(P,0) AS Phone, 
      ISNULL(E,0) AS Email, 
      ISNULL(W,0) AS WEB 
      FROM 
      (
      select ComplaintMedia_Abbri, 
      ddate,COUNT(ComplaintMedia) as c 
      from Complaint 
      INNER JOIN @temp 
      ON convert(datetime,convert(varchar(10),ComplaintDate,101),101)=convert(datetime,convert(varchar(10),ddate,101),101)   
      WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
      group by ComplaintMedia_Abbri,ddate 
    ) p 

    pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt 

    ) AS [A] 

    INNER JOIN 

    (
    select ddate,ISNULL(L,0) AS LetterTot, 
     ISNULL(P,0) AS PhoneTot, 
     ISNULL(E,0) AS EmailTot, 
     ISNULL(W,0) AS WEBTot 
     FROM 
     (

    select ComplaintMedia_Abbri,ddate, 
    COUNT(ComplaintMedia_Abbri) as c 
    from Complaint 

    INNER JOIN @temp 
    ON convert(datetime,convert(varchar(10),ComplaintDate,101),101)<=convert(datetime,convert(varchar(10),ddate,101),101)  

    WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
    group by ComplaintMedia_Abbri,ddate 
    ) p 

    pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt 



    ) AS [B] 

    ON A.ddate=B.ddate 

    order by A.ddate 
+1

À quoi ressemblent vos données et quel serait le résultat attendu? –

+0

les colonnes attendues sont les résultats des requêtes deuxième et troisième partie ... – rahularyansharma

+0

@ t-clausen.dk hey question mise à jour avec la requête actuelle et les résultats actuels, mais ils viennent de deux requête différente, je veux fusionner ces deux en un pour améliorer la vitesse pour cette procédure stockée. – rahularyansharma

Répondre

2

J'ai modifié le Fiddle SQL donnée dans le commentaire qui vous donnera la sortie désirée, à condition que vous avez déjà les totaux quotidiens:

http://www.sqlfiddle.com/#!6/09168/2

DECLARE @startDate datetime 
DECLARE @endDate datetime 

SELECT @startDate = '2012-10-08' 
SELECT @endDate = '2012-10-12' 

SELECT 
    DT1.ddate, 
    DT1.phone, 
    DT1.letter, 
    DT1.email, 
    DT1.web, 
    SUM(DT2.phone) phoneTotal, 
    SUM(DT2.letter) letterTotal, 
    SUM(DT2.email) emailTotal, 
    SUM(DT2.web) webTotal 
    FROM 
    DailyTotals DT1 
    LEFT JOIN DailyTotals DT2 ON DT1.ddate >= DT2.ddate AND DT2.ddate >= @startDate 
    WHERE 
    DT1.ddate <= @endDate 
    GROUP BY 
    DT1.ddate, 
    DT1.phone, 
    DT1.letter, 
    DT1.email, 
    DT1.web 

Si vous voulez faire une déclaration vous devrez remplacer les DailyTotals avec votre sous-requête qui vous donne les totaux quotidiens. Cependant, je suggère de faire une vue appelée DailyTotals et d'utiliser cela.

EDIT:

Vous pouvez utiliser un CTE pour générer votre plage de dates au lieu de la table temporaire. J'ai modifié votre requête complète que vous dites fonctionne pour rejoindre le CTE au lieu de @temp. Je n'ai aucun moyen de le tester cependant. Si cela ne fonctionne pas, créez un Fiddle SLQ avec votre schéma et je l'essayerai à nouveau.

WITH Dates AS 
(
    SELECT CONVERT(date, MIN(ComplaintTime)) AS ddate, 
    MAX(ComplaintTime) as EndDate 
    FROM 
     Complaints 
    UNION ALL 
    SELECT DATEADD(DAY, 1, ddate), EndDate 
    FROM Dates 
    WHERE DATEADD(DAY, 1, ddate) <= EndDate 
    ) 

SELECT * FROM 

     (select ddate,ISNULL(L,0) AS Letter, 
      ISNULL(P,0) AS Phone, 
      ISNULL(E,0) AS Email, 
      ISNULL(W,0) AS WEB 
      FROM 
      (
      select ComplaintMedia_Abbri, 
      ddate,COUNT(ComplaintMedia) as c 
      from Complaint 
      INNER JOIN Dates 
      ON convert(date,ComplaintDate)=ddate OPTION (MAXRECURSION 500) 
      WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
      group by ComplaintMedia_Abbri,ddate 
    ) p 

    pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt 

    ) AS [A] 

    INNER JOIN 

    (
    select ddate,ISNULL(L,0) AS LetterTot, 
     ISNULL(P,0) AS PhoneTot, 
     ISNULL(E,0) AS EmailTot, 
     ISNULL(W,0) AS WEBTot 
     FROM 
     (

    select ComplaintMedia_Abbri,ddate, 
    COUNT(ComplaintMedia_Abbri) as c 
    from Complaint 

    INNER JOIN Dates OPTION (MAXRECURSION 0) 
    ON CONVERT(date,ComplaintDate) <= ddate OPTION (MAXRECURSION 0) 

    WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1  
    group by ComplaintMedia_Abbri,ddate 
    ) p 

    pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt 



    ) AS [B] 

    ON A.ddate=B.ddate 

    order by A.ddate 
+0

hey vous avez fait du bon travail, mais le problème avec votre solution est que son seulement me donner total, je suis ne cherche pas le total courant, je cherche une valeur de jour et la somme de cette colonne précédente à ce jour ... – rahularyansharma

+0

@rahularyansharma - Réponse éditée. – Tobsey

+0

L'instruction s'est terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction. :( – rahularyansharma

Questions connexes