如何从SQL Server中的count中获取多个表中的不同值?

时间:2017-07-15 05:11:56

标签: sql-server

我遇到的情况是我需要从包含列名'YrId'的多个表中获取记录,并且我只想从该表中检索不同的值以及我想获取分组值的数量按'YrId'。要获取包含多于0个值的列,我有以下查询,该查询返回具有所需列

的表名
SELECT 
    t.name AS [Table Name],
    'Total Record Count'=max(i.rows)
FROM 
    sys.tables AS t
INNER JOIN 
    sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
INNER JOIN 
    sysindexes i ON t.object_id=i.id
WHERE 
    c.name LIKE '%yrid%' 
GROUP BY 
    t.name
HAVING 
    MAX(i.rows) > 0
ORDER BY 
    [total record count] DESC

从这个查询中,我得到了一个列名为'yrid'的表名,以获得不同的值我对上面给定查询返回的表名运行以下查询。

select distinct yrid, 'Table1' 
from Table1

但是上面的查询有问题,它在多行集中生成输出,我不想要。我想在同一行集中生成输出,如下所示:

Table Name  YrId1Count  YrId2Count
----------------------------------
Table1       250           350
Table2       320           410

据我所知,它可以通过PIVOT实现,但我没有做到这一点。

1 个答案:

答案 0 :(得分:0)

从问题中,我假设您需要特定列的数量(在我的示例中说employeeid)。 下面的示例将找到包含EmployeeId列的所有表,它将在每个表中找到Distinct EmployeeId并插入@TableCounts。最后,你有@Table Counts,每个都有表和唯一数量的employeeIds。

DECLARE @t TABLE ( name NVARCHAR(MAx))

DECLARE @curCol NVARCHAR(50), @query NVARCHAR(MAX)

DECLARE @TableCounts TABLE (Name Nvarchar(max), NumberOfEmp INT)


INSERT INTO @t
SELECT 

   t.name

FROM 
    sys.tables AS t
INNER JOIN 
    sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 

WHERE 
    c.name LIKE '%EmployeeId%' 

    SELECT * FROM @t



    WHILE((SELECT COUNT(*) FROM @t)>0)
    BEGIN
        SELECT Top 1 @curCol = name FROM @t

        SET @query = 'INSERT INTO @TableCounts SELECT '''+@curCol+''',COUNT(DISTINCT EmployeeID) FROM ' + @curCol



        EXEC sp_executesql @query;

        DELETE FROM @t where name = @curCol
    END


    SELECT * FROM @TableCounts

希望有助于!!! :)