2016-02-14 114 views
2

我想計數CHAT行,他們REASON_IDREASON_GROUP表存在:如何從另外兩個表中動態計算表中的行數?

第一個表Chat

ID REASON_ID DEPARTMENT_ID  
1  46   1 
2  46   1 
3  50   1 
4  50   2 
5  100   1 
6  100   2 

二表Reason

ID REASON_NAME  REASON_GROUP_ID 
46 Reason1   1 
50 Reason2   1 
100 Reason3   2 
101 Reason4   2 
105 Reqson5   3 

三表Reason_Group

ID NAME 
1  Group1 
2  Group2 
3  Group3 

我想顯示結果這樣的:

Reason1 Reason2 Reason3 Reason4 Reason5 
2   2   2   0   0  
+1

閱讀關於旋轉。 – philipxy

+0

它必須在一行嗎?如何顯示不同行中的計數(名稱+值)? – Noy

+0

爲什麼你的問題有mysql和tsql標籤?你使用MS SQL服務器嗎? –

回答

2

您可以使用PIVOT和動態SQL爲:

​​

結果:

Reason1  Reason2  Reason3  Reason4  Reqson5 
2   2   2   0   0 

其實你可以做到沒有PIVOT,但你仍然有t Ø使用動態SQL,我不知道你怎麼能解決你的任務,而不動態SQL :(

所以這是沒有迴轉的解決方案:

DECLARE @DynamicQuery AS nvarchar(max) 
DECLARE @AgrColumns AS nvarchar(max) 

--Get distinct values of the Column 
SELECT @AgrColumns = ISNULL(@AgrColumns + ',', '') + 'SUM(CASE WHEN REASON_NAME = ''' + REASON_NAME + ''' THEN cnt ELSE 0 END) AS ' + QUOTENAME(REASON_NAME) 
FROM (SELECT DISTINCT REASON_NAME FROM Reason) AS Reasons 

--Prepare the query using the dynamic 
SET @DynamicQuery = 
N'SELECT ' + @AgrColumns + ' FROM 
(
    SELECT r.REASON_NAME, SUM(CASE WHEN c.ID is null OR rg.ID IS NULL THEN 0 ELSE 1 END) AS cnt 
    FROM Reason r 
    LEFT JOIN Chat c ON (c.REASON_ID = r.ID) 
    LEFT JOIN Reason_Group rg ON (r.REASON_GROUP_ID = rg.ID) 
    GROUP BY REASON_NAME 
) inn' 

--Execute the Dynamic Query 
EXEC sp_executesql @DynamicQuery 
+0

soo tnx您的有用答案 –

相關問題