mysql - 如何动态计算另一个表中一个表中的行数?

标签 mysql database t-sql pivot

我想计算 CHAT 中的行数表他们的REASON_ID列存在于 REASON_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      

最佳答案

您可以使用 PIVOT 和动态 sql 来实现:

DECLARE @DynamicPivotQuery AS nvarchar(max)
DECLARE @ColumnName AS nvarchar(max)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',', '') + QUOTENAME(REASON_NAME)
FROM (SELECT DISTINCT REASON_NAME FROM Reason) AS Reasons

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery =
N'SELECT ' + @ColumnName + ' 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
    PIVOT(AVG(cnt) 
          FOR REASON_NAME IN (' + @ColumnName + ')) AS PVTTable'

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

结果:

Reason1     Reason2     Reason3     Reason4     Reqson5   
2           2           2           0           0

其实你可以不用PIVOT来做到这一点,但是你仍然必须使用动态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

关于mysql - 如何动态计算另一个表中一个表中的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389142/

相关文章:

mysql - 选择具有一个最大日期的两个不同列

mysql - 我无法启动 mysql(我同时使用 xampp 和 appserve)

database - Doctrine 中给出的 Symfony2 : spl_object_hash() expects parameter 1 to be object, 字符串

mysql - 选择每个类别中具有最大时间戳的行

t-sql - 如何在另一个字段的计算中使用别名

php - 使用 SQL、PHP 或 JS 解码通过 ws_concat(mysql) 连接的两个 JSON 字符串

php - MySQL删除重复的反向值

php - 尝试使用 PDO 从数据库动态加载数据

sql-server-2005 - SQL Server 搜索过滤器和排序性能问题

sql - 在 Select 中使用存储过程 (T-SQL)