问题描述
输入
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