【问题标题】:Count the match values and display in matrix form计算匹配值并以矩阵形式显示
【发布时间】:2019-01-10 11:36:39
【问题描述】:

我有以下表格,其中包含一些示例数据:

表:TblTestDB

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

INSERT INTO TblTestDB VALUES(1,'Sam'),(2,'Jack'),
                            (3,'Rock'),(4,'Don'),(5,'Tam');

表:TblDB1

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

INSERT INTO TblDB1 VALUES(1,'Sam'),(2,'Jack'),
                         (3,'Rock');

表:TblDB2

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

INSERT INTO TblDB2 VALUES(1,'Jazz'),(2,'Dsouze'),
                         (3,'Rock'),(4,'Jack');

表:TblDB3

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

INSERT INTO TblDB3 VALUES(1,'Sam'),(2,'Jazz'),
                         (3,'Rock');

我想以如下形式显示结果:

TableName   Name    ID
------------------------------
TblDB1      3       3
TblDB2      2       4
TblDB3      2       3

关于结果集的说明:我想显示在表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

问题:我可能会得到超过 10 列来显示,如矩阵/枢轴,上面的查询根据列列表增长。 任何更好的方法来使它简短而简单。

【问题讨论】:

    标签: sql-server tsql sql-server-2008-r2


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      这么简单吗?

      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 列来显示像矩阵/枢轴”。 例如,如果您要添加一个姓氏列,应该独立匹配,还是与名称列结合? (前者可能有点复杂……)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多