如何使用SQL Server 2016比较基于两个关键列的单个列的数据?

问题描述

输入

 Material    code   description    Name       Process 
   A            1       Test          BioKit     Mixing 
   A            2       Test          BioKit     Mixing    
   A            3       Test                     Mixing    
   A            4       Test123       BioKit     Mixing    
   B            1       Test          BioKit     GRINDING 
   B            2       Test          BioKit234  MixinG   

我有一个表格,其中包含代码和材料作为每种材料的关键列,该代码将可用 在这里,我需要比较物料A的各个列数据 3条记录的描述相同,而4条记录的值不同,那么我们需要在输出下面显示 所有记录的名称都相同,即使其中包含空白并且处理也相同

对于材料B的描述是一样的,对于名称字段两个不同的值,那么我们需要在输出下方显示
处理不同的值

输出

Material,Description,Name,Process,code1,code2,code3,code4 
A          Test123,4 
B,BioKit234,Mixing,2,

能否请您提示我如何根据列的材料和代码比较单个表中的各个列数据?

解决方法

如果您希望获得具有最高代码的材料,则可以编写如下内容:

WITH HighestCode(Material,Code) AS (SELECT Material,MAX(code) FROM Table2 GROUP BY Material)
SELECT t.* FROM HighestCode hc INNER JOIN Table2 t ON hc.Material = t.Material AND hc.Code = t.Code;

结果

Material Code Description Name      Process
-------- ---- ----------- --------- -------
B        2    Test        BioKit234 Mixing
A        4    Test123     BioKit    Mixing
,

仍然不确定我是否理解正确,但这可以为您指明正确的方向:

我使用材料视图来模拟材料表,但是如果有的话,请使用该视图:

CREATE VIEW Material
AS
SELECT DISTINCT Material FROM Table2
GO

为每种材料的每个标准值创建一些辅助视图:

CREATE VIEW StandardDescription
AS
WITH MostCommon(Material,Description,DescriptionCount) AS (SELECT Material,COUNT(Description) FROM Table2 GROUP BY Material,Description)
SELECT mat.Material,(SELECT TOP 1 Description FROM MostCommon mc WHERE mc.Material = mat.Material ORDER BY DescriptionCount DESC) AS StandardDescription FROM Material mat
GO

CREATE VIEW StandardName
AS
WITH MostCommon(Material,Name,NameCount) AS (SELECT Material,COUNT(Name) FROM Table2 GROUP BY Material,Name)
SELECT mat.Material,(SELECT TOP 1 Name FROM MostCommon mc WHERE mc.Material = mat.Material ORDER BY NameCount DESC) AS StandardName FROM Material mat
GO

CREATE VIEW StandardProcess
AS
WITH MostCommon(Material,Process,ProcessCount) AS (SELECT Material,COUNT(Process) FROM Table2 GROUP BY Material,Process)
SELECT mat.Material,(SELECT TOP 1 Process FROM MostCommon mc WHERE mc.Material = mat.Material ORDER BY ProcessCount DESC) AS StandardProcess FROM Material mat
GO

确定非标准行:

CREATE VIEW NonStandardTextsPerMaterial
AS
SELECT t.Material,t.Code,t.Description,NULL AS Name,NULL AS Process FROM Table2 t INNER JOIN StandardDescription v ON t.Material = v.Material WHERE Description != StandardDescription
UNION
SELECT t.Material,NULL AS Description,t.Name,NULL AS Process FROM Table2 t INNER JOIN StandardName v ON t.Material = v.Material WHERE Name != StandardName
UNION
SELECT t.Material,t.Process FROM Table2 t INNER JOIN StandardProcess v ON t.Material = v.Material WHERE Process != StandardProcess
GO

将它们累积到同一行:

SELECT Material,Code,MAX(Description) AS Description,MAX(Name) AS Name,Max(Process) AS Process FROM NonStandardTextsPerMaterial GROUP BY Material,Code;
GO