简体   繁体   English

Select 只有两个不同列的所有列

[英]Select all columns with only two distinct columns

In my SQL Server database, I have a table with many duplicate values and I need to fetch results with distinct columns EID and YEAR and select rows containing fewer NULL values or order the table and get a final DISTINCT column EID and YEAR rows. In my SQL Server database, I have a table with many duplicate values and I need to fetch results with distinct columns EID and YEAR and select rows containing fewer NULL values or order the table and get a final DISTINCT column EID and YEAR rows.

For example: below the table with EID = E138442 and YEAR = 2019 occurs 21 times were in this duplicate the row containing fewer null values should be fetched例如:在 EID = E138442 和 YEAR = 2019 的表下方出现 21 次,在此重复中,应获取包含较少 null 值的行

+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|   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    |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+

I need a SQL query to fetch values as shown here:我需要一个 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    |
+---------+------+------+------+------+------+------+------+------+------+------+------+------+------+

The result table should have a final row with distinct columns EID and YEAR.结果表的最后一行应该有不同的列 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;  

I tried the above code but found irrelevant results我尝试了上面的代码,但发现了不相关的结果

since you have no other way to distinguish members of a group and based on "select rows containing fewer NULL values " here is one way how you can do it by using ctes, its not clean but probably the only way:因为您没有其他方法来区分组的成员,并且基于“选择包含较少 NULL 值的行”,这是您可以通过使用 ctes 来做到这一点的一种方法,它不干净但可能是唯一的方法:

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

If you have duplicate minimum null per group you can use query below:如果每个组有重复的最小 null,您可以使用以下查询:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM