Sql 需要水平扫描行,并将数据与其他表进行比较,从而获得max ID的数据

Sql 需要水平扫描行,并将数据与其他表进行比较,从而获得max ID的数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要水平比较数据,并将该数据与其他表的记录进行比较,并且需要获取该行的MaxID数据 以下是场景: 我有一个包含颜色数据的表: 在这张图片中,每种颜色都有自己的ID 以下是包含clas信息数据的表的图像: 因此,所需的输出是: 输出说明: 如果检查包含类数据的第二个图像: 我只需要检查列名末尾有颜色的列 在这个场景中,我们有3列:数学颜色、科学颜色、物理颜色 我需要得到该颜色的MaxID输出 例如:对于1类,我们有白色、黄色和白色 表示白色的ID为1,黄色的ID为3,因此类_ID 1的输出为黄

我需要水平比较数据,并将该数据与其他表的记录进行比较,并且需要获取该行的MaxID数据

以下是场景:

我有一个包含颜色数据的表:

在这张图片中,每种颜色都有自己的ID

以下是包含clas信息数据的表的图像:

因此,所需的输出是:

输出说明:

如果检查包含类数据的第二个图像:

我只需要检查列名末尾有颜色的列

在这个场景中,我们有3列:数学颜色、科学颜色、物理颜色

我需要得到该颜色的MaxID输出

例如:对于1类,我们有白色、黄色和白色

表示白色的ID为1,黄色的ID为3,因此类_ID 1的输出为黄色

对于Clas_ID 2,我们有白色,红色,绿色表示白色为1,红色为4,绿色为2,因此输出为红色

我得到了这个输出,但它是静态的…我需要动态输出,因为将来我们可能会改变颜色的顺序…所以,基于这个顺序,颜色输出也需要改变

以下是我正在使用的代码:

DECLARE @COLOR VARCHAR(8000)
DECLARE @SQL VARCHAR(MAX)

CREATE TABLE #TEMP
( CLASS_ID INT,
CLASS_COLOR VARCHAR(50))

SELECT
@COLOR = COALESCE(@COLOR + '+', '') + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Class_Info' AND COLUMN_NAME LIKE '%COLOR'

SET @SQL = 
'INSERT #TEMP
 SELECT Clas_ID
        ,CASE WHEN CHARINDEX(''RED'','+ @COLOR +') <> 0  THEN ''RED''
              WHEN CHARINDEX(''YELLOW'', '+ @COLOR + ') <> 0 THEN ''YELLOW''
              WHEN CHARINDEX(''GREEN'', '+@COLOR + ') <> 0 THEN ''GREEN''    
              WHEN CHARINDEX(''WHITE'', ' + @COLOR + ') <> 0 THEN ''WHITE''
              ELSE ''NO_COLOR'' END AS CLASS_COLOR
FROM 
Class_Info'

Execute(@SQL)
select * from #TEMP
有人能给我一些建议吗?我如何比较颜色和ID,并在输出中得到maxid的颜色

注意:我不能使用Class_info表中的列名,因为将来我们可以删除或添加更多列。。。所以,我需要有一个动态查询,给我完美的结果

提前感谢

您可以尝试以下方法:

 CREATE TABLE #tb_color(ID INT ,color VARCHAR(100))
 INSERT INTO #tb_color
    SELECT 1,'White' UNION
    SELECT 2,'Green' UNION
    SELECT 3,'Yellow' UNION
    SELECT 4,'Red'
CREATE TABLE #tb_class(Class_ID INT ,Class VARCHAR(100),Maths_Color VARCHAR(100),Science_color VARCHAR(100),Phasic_color VARCHAR(100),Class_welth VARCHAR(100))
INSERT INTO #tb_class
    SELECT 1,'1st sem','White','Yellow','White','Fair' UNION
    SELECT 2,'2nd sem','White','Red','Green','Bad' UNION
    SELECT 3,'3rd sem','Green','White','White','Good' UNION
    SELECT 4,'4th sem','Yellow','Green','Yellow','Fair' UNION
    SELECT 5,'5th sem','White','White','White','Best' UNION
    SELECT 6,'6th sem','Green','Yellow','White','Fair' UNION
    SELECT 7,'7th sem','Yellow','White','White','Fair' UNION
    SELECT 8,'8th sem','Green','Yellow','Red','Bad' 
DECLARE @cols VARCHAR(max),@sql VARCHAR(max)
SELECT @cols=ISNULL(@cols+',(','(')+QUOTENAME(c.name) +')'
FROM tempdb.sys.columns AS c WHERE c.object_id=OBJECT_ID('tempdb..#tb_class') AND  c.name NOT IN  ('Class_ID','Class','Class_welth')
PRINT @cols
SET @sql='
SELECT t.Class_ID,c.color FROM (
    SELECT tc.Class_ID,MAX(c.ID) AS MaxID
    FROM #tb_class AS tc
    CROSS APPLY(VALUES'+@cols+') n(color)
    INNER JOIN #tb_color AS c ON c.color=n.color
    GROUP BY tc.Class_ID
) AS t INNER JOIN #tb_color AS c ON c.ID=t.MaxID'
EXEC(@sql)

谢谢你的回复,但我需要查询动态…这个数据库只是一个例子…我不能使用列名,因为将来我们可以删除或添加列,还有一些表中我们有20多列,其中有颜色,所以,它需要是动态查询…谢谢你的努力…谢谢你的回答…我更新了一些东西,但效果很好…谢谢你的支持…非常感谢 Class_ID color ----------- ------ 1 Yellow 2 Red 3 Green 4 Yellow 5 White 6 Yellow 7 Yellow 8 Red