这是我的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,任何帮助将不胜感激!
1条答案
按热度按时间ghg1uchk1#
你的问题很复杂,我不能百分之百确定你真正想要什么。但基于:
对于唯一的tid,如果字段中的两个记录都已填充,则我需要字段的名称。
可以取消拆分和聚合。假设所有列都具有相似的数据类型,则可以使用: