列上的sql case语句

eimct9ow  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(380)

这是我的table:

对于每个唯一的tid,有2个记录。对于唯一的tid,如果字段中的两个记录都已填充,则我需要字段的名称。例如,对于t01:field2和field4都填充了记录。
我目前的方法是用逗号分隔的值创建一列,字段名为:

INSERT INTO TEMP
SELECT *, 
       (CASE WHEN COUNT(IIF(Field1 IS NOT NULL,1,NULL)) = 2 THEN 'FIELD1' ELSE 'NO' END) + ',' +
       (CASE WHEN COUNT(IIF(Field2 IS NOT NULL,1,NULL)) = 2 THEN 'FIELD2' ELSE 'NO' END) + ',' +
       (CASE WHEN COUNT(IIF(Field3 IS NOT NULL,1,NULL)) = 2 THEN 'FIELD3' ELSE 'NO' END) + ',' +
       (CASE WHEN COUNT(IIF(Field4 IS NOT NULL,1,NULL)) = 2 THEN 'FIELD4' ELSE 'NO' END) AS ATTR
FROM ORIGINAL_TABLE;

然后,我将逗号分隔的列转换为多个记录:

SELECT *, S.ITEMS as ATTRIBUTES
FROM TEMP
CROSS APPLY DBO.SPLIT(ATTR, ',') S
WHERE S.ITEMS NOT LIKE '%NO%'

考虑从上述命令获得的结果的t101,这将给出输出:

编辑:道歉。它应该是field2而不是field1。
这确实为我提供了每个唯一的tid字段的信息,但我希望它更具体。我对超过100列的大数据运行这个方法,所以这个方法很慢。
有办法得到这个吗?在这里,我只显示满足条件的字段以及t101中两条记录的值。

编辑:道歉。表中应该是field2而不是field1。
我是一个新的sql,任何帮助将不胜感激!

ghg1uchk

ghg1uchk1#

你的问题很复杂,我不能百分之百确定你真正想要什么。但基于:
对于唯一的tid,如果字段中的两个记录都已填充,则我需要字段的名称。
可以取消拆分和聚合。假设所有列都具有相似的数据类型,则可以使用:

SELECT t.tId, v.fieldname
FROM ORIGINAL_TABLE t CROSS APPLY
     (VALUES ('Field1', Field1), 
             ('Field2', Field2), 
             ('Field3', Field3), 
             ('Field4', Field4)
     ) v(fieldname, val)
GROUP BY t.tID, v.fieldname
HAVING COUNT(*) = COUNT(v.val)  -- all populated

相关问题