2011-05-10 3 views
2

J'ai le tableau suivantGroupe SQL Distinct Count

User ID Start Date End Date 
------------------------------------- 
John Doe Mar 11 2011 May 28 2011 
Robret S Mar 21 2011 Jun 29 2011 
Tina T  Feb 01 2011 August 20 2011 

Je veux montrer combien de personnes je disponibles pour les 6 derniers mois, même si le mois n'a pas de personnes. Comment cela est-il possible. Je sais que je dois faire du regroupement et utiliser un nombre distinct.

Résultats escomptés:

February = 1 Resource 
March  = 3 Resources 
April  = 3 Resources 
May  = 3 Resources 
June  = 2 Resources 
July  = 1 Resource 
August = 1 Resource 
+1

Il est pas clair pour moi ce que vous demandez. Pouvez-vous poster un peu plus de données d'échantillon et de sortie attendue? –

Répondre

0

Vous aurez besoin des enregistrements de données existants pour les 6 derniers mois, de sorte que vous pouvez fusionner les deux ensembles de données. Vous pouvez générer les 6 derniers mois dans un CTE et faire une jointure à gauche avec vos données. Cela vous permettra de montrer les 6 derniers mois même si vous n'avez pas de données.

0

Je ne pense pas que vous puissiez faire ce que vous voulez en utilisant une instruction de sélection "simple" (même en utilisant GROUPING etc.) Ce qui suit est hors de ma tête, donc vous devrez l'expérimenter un peu , et de préférence lire l'excellent livre de Joe Celko SQL for Smarties.

Vous devez créer une deuxième table contenant tous vos mois (dates de début et de fin). Vous avez seulement besoin d'une table pour tous les types de requêtes similaires, et il doit contenir tous les mois à la date se situe votre intérêt à l'interrogation:

CREATE TABLE months (id, start DATE, end DATE); 

INSERT INTO months (id, start, end) 
      values ((1, 2011-01-01, 2011-01-31), 
        (2, 2011-02-01, 2011-02-28), ...); 

Vous alors LEFT OUTER JOIN de votre table utilisateur à cette table de mois. Cela vous donnera une ligne pour chaque utilisateur pour chaque mois, ils étaient disponibles, que vous pouvez GROUP au besoin:

SELECT months.id, COUNT(user.id) 
    FROM months LEFT OUTER JOIN users 
     ON user.start_date < months.end 
     AND user.end_date > months.start 
GROUP BY months.id; 

espoir qui aide.

2
With Calendar As 
    (
    Select Cast('20110501' As DateTime) As [Date] 
    Union All 
    Select DateAdd(m,-1,[Date]) 
    From Calendar 
    Where [Date] > DateAdd(m,-5,'20110501') 
    ) 
Select DateName(m, C.Date) + ' ' + Cast(Year(C.Date) As char(4)) 
    , Case Count(*) 
     When 1 Then Cast(Count(*) As varchar(10)) + ' Resource' 
     Else Cast(Count(*) As varchar(10)) + ' Resources' 
     End 
From Calendar As C 
    Left Join MyTable As T 
     On C.Date Between T.StartDate And T.EndDate 
Group By C.Date 

Résultats:

 
December 2010 | 1 Resource 
January 2011 | 1 Resource 
February 2011 | 1 Resource 
March 2011  | 1 Resource 
April 2011  | 3 Resources 
May 2011  | 3 Resources 
0
WITH resources AS (
    SELECT 
    Date = DATEADD(month, v.number, [Start Date]) 
    FROM atable t 
    INNER JOIN master.dbo.spt_values v ON v.type = 'P' 
     AND v.number BETWEEN 0 AND DATEDIFF(month, t.[Start Date], t.[End Date]) 
) 
SELECT 
    Month = DATENAME(month, Date), 
    ResourceCount = CAST(COUNT(*) AS varchar(30)) + 
        CASE COUNT(*) WHEN 1 THEN ' Resource' ELSE ' Resources' END 
FROM resources 
WHERE Date > DATEADD(month, -6, DATEADD(day, -DAY(GETDATE()), GETDATE())) 
GROUP BY YEAR(Date), MONTH(Date), DATENAME(month, Date) 
ORDER BY YEAR(Date), MONTH(Date)