我遇到的情况是我需要从包含列名'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实现,但我没有做到这一点。
答案 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
希望有助于!!! :)