Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以获取同一表中字段的比较_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 查询以获取同一表中字段的比较

Sql 查询以获取同一表中字段的比较,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正试图构建一个逻辑来获取报告中的匹配字段,以便能够像预期的查询输出屏幕截图所示,并排比较报告 现有表中的行:- 预期查询输出:- 为了实现这一点,我尝试使用内部联接构建一个SQL查询。 但在这种情况下,这似乎行不通。现在我的脑子一片空白。 有人能指引我正确的方向吗 下面是我试图构建的示例代码 ; WITH CTE AS ( SELECT 'R1' AS ReportName, 'A' FieldName, 'M' FieldType UNION ALL SELECT 'R

我正试图构建一个逻辑来获取报告中的匹配字段,以便能够像预期的查询输出屏幕截图所示,并排比较报告

现有表中的行:-

预期查询输出:-

为了实现这一点,我尝试使用内部联接构建一个SQL查询。 但在这种情况下,这似乎行不通。现在我的脑子一片空白。 有人能指引我正确的方向吗

下面是我试图构建的示例代码

; WITH CTE AS (
          SELECT 'R1' AS ReportName, 'A' FieldName, 'M' FieldType
UNION ALL SELECT 'R1' AS ReportName, 'B' FieldName, 'D' FieldType
UNION ALL SELECT 'R1' AS ReportName, 'C' FieldName, 'D' FieldType
UNION ALL SELECT 'R1' AS ReportName, 'D' FieldName, 'D' FieldType
UNION ALL SELECT 'R2' AS ReportName, 'A' FieldName, 'M' FieldType
UNION ALL SELECT 'R2' AS ReportName, 'B' FieldName, 'D' FieldType
UNION ALL SELECT 'R2' AS ReportName, 'D' FieldName, 'D' FieldType
UNION ALL SELECT 'R3' AS ReportName, 'K' FieldName, 'M' FieldType
UNION ALL SELECT 'R3' AS ReportName, 'C' FieldName, 'D' FieldType
UNION ALL SELECT 'R4' AS ReportName, 'P' FieldName, 'D' FieldType
UNION ALL SELECT 'R4' AS ReportName, 'Q' FieldName, 'D' FieldType
UNION ALL SELECT 'R4' AS ReportName, 'R' FieldName, 'M' FieldType
UNION ALL SELECT 'R5' AS ReportName, 'A' FieldName, 'M' FieldType
UNION ALL SELECT 'R5' AS ReportName, 'B' FieldName, 'D' FieldType
UNION ALL SELECT 'R5' AS ReportName, 'L' FieldName, 'M' FieldType
)

SELECT C1.ReportName, count(C1.FieldName), C2.ReportName, COUNT(C2.FieldName) FROM CTE C1
inner join CTE C2 
on C1.FieldName = C2.FieldType
and C1.FieldType = C2.FieldType
group by C1.ReportName, C2.ReportName
不带代码的逻辑也是受欢迎的:

试试这个:

      ; WITH CTE AS (
                  SELECT 'R1' AS ReportName, 'A' FieldName, 'M' FieldType
        UNION ALL SELECT 'R1' AS ReportName, 'B' FieldName, 'D' FieldType
        UNION ALL SELECT 'R1' AS ReportName, 'C' FieldName, 'D' FieldType
        UNION ALL SELECT 'R1' AS ReportName, 'D' FieldName, 'D' FieldType
        UNION ALL SELECT 'R2' AS ReportName, 'A' FieldName, 'M' FieldType
        UNION ALL SELECT 'R2' AS ReportName, 'B' FieldName, 'D' FieldType
        UNION ALL SELECT 'R2' AS ReportName, 'D' FieldName, 'D' FieldType
        UNION ALL SELECT 'R3' AS ReportName, 'K' FieldName, 'M' FieldType
        UNION ALL SELECT 'R3' AS ReportName, 'C' FieldName, 'D' FieldType
        UNION ALL SELECT 'R4' AS ReportName, 'P' FieldName, 'D' FieldType
        UNION ALL SELECT 'R4' AS ReportName, 'Q' FieldName, 'D' FieldType
        UNION ALL SELECT 'R4' AS ReportName, 'R' FieldName, 'M' FieldType
        UNION ALL SELECT 'R5' AS ReportName, 'A' FieldName, 'M' FieldType
        UNION ALL SELECT 'R5' AS ReportName, 'B' FieldName, 'D' FieldType
        UNION ALL SELECT 'R5' AS ReportName, 'L' FieldName, 'M' FieldType
        )
SELECT DISTINCT A.REPO_NAME1, RC1,B.REPO_NAME2, RC2, MF  
FROM  (SELECT C1.ReportName AS REPO_NAME1, FieldName AS FIELD_N1, FieldType AS FIELD_T1,COUNT(*) OVER (PARTITION BY C1.ReportName) AS RC1
        FROM CTE C1
        ) A
LEFT JOIN (SELECT C2.ReportName AS REPO_NAME2,  FieldName AS FIELD_N2, FieldType AS FIELD_T2,COUNT(*) OVER (PARTITION BY C2.ReportName) AS RC2
        FROM CTE C2
        ) B ON A.FIELD_N1 = B.FIELD_N2
        and A.FIELD_T1 = B.FIELD_T2
        AND A.REPO_NAME1 <> B.REPO_NAME2
LEFT JOIN (SELECT C3.ReportName AS REPO_NAME1, C4.ReportName AS REPO_NAME2, COUNT(*) AS MF
            FROM CTE C3
            LEFT JOIN CTE C4 ON C3.FieldName = C4.FieldName
                            AND C3.FieldType = C4.FieldType
                            AND C3.ReportName <> C4.ReportName
           GROUP BY C3.ReportName, C4.ReportName
           ) D ON A.REPO_NAME1 = D.REPO_NAME1 AND B.REPO_NAME2= D.REPO_NAME2
ORDER BY A.REPO_NAME1
试试这个:

DECLARE @table TABLE (ReportName NVARCHAR(2),Field NVARCHAR(2), FieldType NVARCHAR(2))
INSERT INTO @table VALUES
('R1','A','M'),('R1','B','D'),('R1','C','D'),('R1','D','D'),('R2','A','M'),('R2','B','D'),('R2','D','D'),
('R3','K','M'),('R3','C','D'),('R4','P','D'),('R4','Q','D'),('R5','A','M'),('R5','B','D'),('R5','L','M')

;WITH AA AS (SELECT ReportName,Count(ReportName) TotalFields FROM @table GROUP BY ReportName)

SELECT AA.ReportName,AA.TotalFields,BB.MatchReport,CC.TotalFields FROM AA LEFT JOIN (
SELECT DISTINCT A.ReportName,B.ReportName MatchReport FROM @table A 
LEFT JOIN @table B ON A.Field = B.Field AND A.FieldType = B.FieldType AND A.ReportName<>B.ReportName) BB ON AA.ReportName = BB.ReportName
LEFT JOIN AA CC ON BB.MatchReport = CC.ReportName

您需要解释可以生成预期输出的数据中的关系。在matchreport中有3行R1和R2、R3、R4,但在matchreport等中只有一行R2和R1,这种关系如何。单个表包含报表名称和字段我想比较那些具有公共字段measure&dimensions的报告,如预期输出所示。我还想要总数,这样我就可以得到详细的视图。所以我们可以说关系是多对多?我的SQL缺少MatchCount字段。因此,我没有得到上述查询中预期输出的匹配计数…:@阿迪蒂亚:你能试试新版本2吗?您的预期结果是否可能与样本数据不完全一致?
DECLARE @table TABLE (ReportName NVARCHAR(2),Field NVARCHAR(2), FieldType NVARCHAR(2))
INSERT INTO @table VALUES
('R1','A','M'),('R1','B','D'),('R1','C','D'),('R1','D','D'),('R2','A','M'),('R2','B','D'),('R2','D','D'),
('R3','K','M'),('R3','C','D'),('R4','P','D'),('R4','Q','D'),('R5','A','M'),('R5','B','D'),('R5','L','M')

;WITH AA AS (SELECT ReportName,Count(ReportName) TotalFields FROM @table GROUP BY ReportName)

SELECT AA.ReportName,AA.TotalFields,BB.MatchReport,CC.TotalFields FROM AA LEFT JOIN (
SELECT DISTINCT A.ReportName,B.ReportName MatchReport FROM @table A 
LEFT JOIN @table B ON A.Field = B.Field AND A.FieldType = B.FieldType AND A.ReportName<>B.ReportName) BB ON AA.ReportName = BB.ReportName
LEFT JOIN AA CC ON BB.MatchReport = CC.ReportName