2011-05-22 98 views
1

需要您的幫助來解決一個問題。幫助困難的'group by'條款

我有一個表Managers (ManagerId, ManagerName)

我有一個表Statuses (StatusId, StatusName)
(有沒有在該表中約10狀態)

我有一個表Clients (ClientId, ClientName, ManagerId, StatusId, WhenAdded)
WhenAdded是DateTime類型)

很明顯,字段'ManagerId' refe rs到表'Managers'並且字段'StatusId'涉及表'Statuses'

用戶想要在下表中獲得一些關於管理員的統計信息(from startDate to endDate using field 'WhenAdded')。

列:

ManagerName, NumberOfClients, NumberOfClientsWithStatus1, NumberOfClientsWithStatus2, NumberOfClientsWithStatus3等。

具有名稱的列數NumberOfClientsWithStatusI其中i是等於表'Statuses'中的行數的狀態數。

我該怎麼做?

t-sql,sql server 2008 r2 express edition。

回答

1
SELECT 
    ManagerName, 
    COUNT(*) AS NumberOfClients, 
    COUNT(CASE WHEN S.StatusId = 1 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus1, 
    COUNT(CASE WHEN S.StatusId = 2 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus2, 
    COUNT(CASE WHEN S.StatusId = 3 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus3, 
    ... 
FROM 
    Clients C 
    JOIN 
    Managers M ON C.ManagerId = M.ManagerId 
    JOIN 
    Statuses S ON C.StatusId = S.StatusId 
WHERE 
    M.WhenAdded BETWEEN @startDate AND @endDate 
GROUP BY 
    M.ManagerName 

注:有沒有乾淨的方式在SQL添加狀態列arbritrary號(不只是SQL Server),因爲它是一個固定的列輸出。你不得不更改狀態查詢,除非您在客戶端

編輯解決這個問題,評論後

SELECT 
    ManagerName, 
    COUNT(*) AS NumberOfClients, 
    COUNT(CASE WHEN S.StatusId = 1 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus1, 
    COUNT(CASE WHEN S.StatusId = 2 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus2, 
    COUNT(CASE WHEN S.StatusId = 3 THEN 1 ELSE NULL END) AS NumberOfClientsWithStatus3, 
    ... 
FROM 
    Managers M ON C.ManagerId = M.ManagerId 
    LEFT JOIN 
    Clients C 
    LEFT JOIN 
    Statuses S ON C.StatusId = S.StatusId 
WHERE 
    M.WhenAdded BETWEEN @startDate AND @endDate 
GROUP BY 
    M.ManagerName 
+0

GBN,沒有對管理者有什麼客戶在一段時間? – 2011-05-22 11:55:41

+0

一個完整的解決方案 – 2011-05-23 00:25:14

0

如果你知道statuses表將始終包含狀態的數量有限,你可以這樣做:

SELECT M.ManagerName, 
     COUNT(C.ClientId) NumberOfClients, 
     SUM(CASE WHEN S.StatusId= 1 THEN 1 ELSE 0 END) NumberOfClientsWithStatus1, 
     SUM(CASE WHEN S.StatusId= 2 THEN 1 ELSE 0 END) NumberOfClientsWithStatus2, 
     ... 
    FROM Clients C 
    JOIN Managers M on M.ManagerId = C.ManagerId 
    JOIN Statuses S on S.StatusId = C.StatusId 
WHERE C.WhenAdded BETWEEN startDate AND endDate 
GROUP BY ManagerName