Sql 选择只有两个不同列的所有列

Sql 选择只有两个不同列的所有列,sql,sql-server,Sql,Sql Server,在我的SQL Server数据库中,我有一个具有许多重复值的表,我需要获取具有不同列的结果EID和YEAR,并选择包含较少空值的行,或者对表进行排序,以获得最终的不同列EID和YEAR行 例如:在EID=E138442且年份=2019发生21次的表格下方,如果在该重复项中,则应获取包含较少空值的行 +---------+------+------+------+------+------+------+------+------+------+------+------+------+-----

在我的SQL Server数据库中,我有一个具有许多重复值的表,我需要获取具有不同列的结果
EID
YEAR
,并选择包含较少空值的行,或者对表进行排序,以获得最终的不同列EID和YEAR行

例如:在EID=E138442且年份=2019发生21次的表格下方,如果在该重复项中,则应获取包含较少空值的行

+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|   EID   | YEAR | JAN  | FEB  | MAR  | APR  | MAY  | JUN  | JUL  | AUG  | SEP  | OCT  | NOV  | DEC  |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| E050339 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
| E050339 | 2020 | NULL | 6    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E050339 | 2020 | 13   | 6    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138348 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    | NULL |
| E138348 | 2019 | NULL | 1    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| e138372 | 2019 | 1    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138440 | 2019 | NULL | NULL | 2    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | NULL | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | NULL | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | NULL | 7    | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | NULL | 7    | 7    | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | NULL | 1    | 7    | 7    | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2019 | NULL | 1    | NULL | 7    | 7    | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2020 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
| E138442 | 2020 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
| E138442 | 2020 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
| E138442 | 2020 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+

我需要一个SQL查询来获取值,如下所示:

+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|   EID   | YEAR | JAN  | FEB  | MAR  | APR  | MAY  | JUN  | JUL  | AUG  | SEP  | OCT  | NOV  | DEC  |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| E050339 | 2020 | 13   | 6    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138348 | 2019 | NULL | 1    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| e138372 | 2019 | 1    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138440 | 2019 | NULL | NULL | 2    | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| E138442 | 2019 | NULL | 1    | NULL | 7    | 7    | 2    | 7    | 7    | 4    | 4    | 9    | 5    |
| E138442 | 2020 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1    |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
结果表的最后一行应具有不同的列EID和YEAR

SELECT *
FROM TABLE_NAME C1 
WHERE EXISTS (SELECT 1
              FROM TABLE_NAME C2
              WHERE C1.EID = C2.EID AND C1.YEAR = C2.YEAR 
              HAVING COUNT(*) = 1)
ORDER BY 
    c1.EID, c1.YEAR, c1.JAN, c1.FEB, c1.MAR, c1.APR,
    c1.MAY, c1.JUN, c1.JUL, c1.AUG, c1.SEP, c1.OCT, c1.NOV, c1.DEC ASC;  

我尝试了上面的代码,但发现了不相关的结果

,因为您没有其他方法来区分组成员,并且基于“选择包含较少空值的行”,这里是一种使用CTE的方法,它不是干净的,但可能是唯一的方法:

with cte as (
SELECT *,
ISNULL(c1.JAN, 1) + ISNULL(c1.FEB,1) +  ... + ISNULL(c1.DEC,1) AS NullCount
FROM 
tablename
) 
, cte2 as (
select EID   , YEAR , min(NullCount)  min_nullcount
from cte 
group by EID   , YEAR 
)

select t.* 
from 
cte t
join cte2 tt
 on t.EID = tt.EID
 and t.YEAR = tt.YEAR
 and t.NULLCount = tt.min_nullcount
如果每个组都有重复的最小空值,则可以使用以下查询:

select * from (
SELECT *,
ROW_NUMBER OVER (partition by EID , YEAR order by ISNULL(c1.JAN, 1) +  ... + ISNULL(c1.DEC,1) AS rnk
FROM 
tablename
) xx
WHERE rnk = 1

不要发布表的图像。将必要的
CREATE
INSERT
语句粘贴为纯文本。哪些列定义了将
eid
year
发布的图像的行“final”的顺序,以使其更易于理解,请帮助我了解StackOverflow标准。图像不能用于在本地数据库中创建表,以便测试和为您创建解决方案(除非有人键入图像中的所有内容,而大多数人(除非他们可能是受虐狂)并不热衷于这样做)。另一方面,发布
CREATE
INSERT
语句使这一过程非常容易。帮助那些需要帮助的人创建帮助。有关如何创建美观的表的一些提示,请参阅。让我尝试一下。将nvarchar值“E382682”转换为数据类型int时,转换错误为“转换失败”。@Yaseerhussan该错误不能来自上面的查询!很抱歉,我的错误,但结果中有重复项。可能每个组中的多行具有相同数量的非空列,如E1384422019