2016-02-14 48 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您的有用答案 –