Sql server 计算匹配值并以矩阵形式显示

Sql server 计算匹配值并以矩阵形式显示,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我有以下表格和一些示例数据: SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID FROM ( SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID FROM TblTestDB a INNER JOIN TblDB1 b ON a.Name = b.Name UNION SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS I

我有以下表格和一些示例数据:

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
表:
TblTestDB

CREATE TABLE TblTestDB (id int,name varchar(100));

INSERT INTO TblTestDB VALUES(1,'Sam'),(2,'Jack'),
                            (3,'Rock'),(4,'Don'),(5,'Tam');
SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
表:
TblDB1

CREATE TABLE TblDB1 (id int,name varchar(100));

INSERT INTO TblDB1 VALUES(1,'Sam'),(2,'Jack'),
                         (3,'Rock');
SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
表:
TblDB2

CREATE TABLE TblDB2 (id int,name varchar(100));

INSERT INTO TblDB2 VALUES(1,'Jazz'),(2,'Dsouze'),
                         (3,'Rock'),(4,'Jack');
SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
表:
TblDB3

CREATE TABLE TblDB3 (id int,name varchar(100));

INSERT INTO TblDB3 VALUES(1,'Sam'),(2,'Jazz'),
                         (3,'Rock');
SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
我想以以下形式显示结果:

TableName   Name    ID
------------------------------
TblDB1      3       3
TblDB2      2       4
TblDB3      2       3
SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
关于结果集的解释:我想显示表
TblTestDB
和其他表(
TblDB1
TblDB2
TblDB3
)之间匹配的列值计数

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
尝试使用以下查询:

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
查询:

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
问题:我可能会得到10多列来显示,比如矩阵/透视,上面的查询会随着列列表的增长而增长。 有没有更好的方法让它简洁明了

这足够简单吗

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB
SELECT DISTINCT 'TblDB1' AS DB
      ,COUNT(CASE WHEN a.Name = b.Name THEN 1 ELSE NULL END) AS Name
      ,COUNT(CASE WHEN a.ID = b.ID THEN 1 ELSE NULL END) AS ID 
FROM TblTestDB a
CROSS JOIN TblDB1 b
UNION ALL
SELECT DISTINCT 'TblDB2' AS DB
      ,COUNT(CASE WHEN a.Name = b.Name THEN 1 ELSE NULL END) AS Name
      ,COUNT(CASE WHEN a.ID = b.ID THEN 1 ELSE NULL END) AS ID 
FROM TblTestDB a
CROSS JOIN TblDB2 b
UNION ALL
SELECT DISTINCT 'TblDB3' AS DB
      ,COUNT(CASE WHEN a.Name = b.Name THEN 1 ELSE NULL END) AS Name
      ,COUNT(CASE WHEN a.ID = b.ID THEN 1 ELSE NULL END) AS ID 
FROM TblTestDB a
CROSS JOIN TblDB3 b
SELECT 
    tableName, sum(s.[Name]) as ncnt, max(s.id) as ID
FROM TblTestDB t
cross apply (
    SELECT tableName, count(name) as [name], max(id) as ID
    FROM (
        SELECT 'TblDB1' as tid, * FROM TblDB1
        union
        SELECT 'TblDB2' as tid, * FROM TblDB2
        union
        SELECT 'TblDB3' as tid, * FROM TblDB3
    ) i
    where i.name = t.name
    group by tableName
) s
group by tableName
我不知道你说的“我可能会有10多列像矩阵/枢轴一样显示”是什么意思。 例如,如果要添加一个姓氏列,应该单独匹配,还是与Name列组合匹配?(前者可能会变得有点复杂…)

SELECT DB,MAX(Name) AS Name, MAX(ID) AS ID
FROM
(
    SELECT 'TblDB1' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB2' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB3' AS DB,COUNT(a.Name) AS Name,0 AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.Name = b.Name
    UNION
    SELECT 'TblDB1' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB1 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB2' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB2 b  ON a.ID = b.ID
    UNION
    SELECT 'TblDB3' AS DB,0 AS Name,COUNT(a.ID) AS ID 
    FROM TblTestDB a
    INNER JOIN TblDB3 b ON a.ID = b.ID
) a
GROUP BY DB