SQL Select语句帮助:如果值存在则使用行,否则使用另一行

时间:2015-11-25 11:35:34

标签: sql linq

这是我的表结构:

DATE (date)
SOURCE (varchar(50))
COMPANY (varchar(50))
PERSON (varchar(50))

然后我说了4行数据:

2015-11-22 , "AUTO", "COMPANY1", "PERSONAUTO"
2015-12-05 , "AUTO", "COMPANY2", "PERSON2"
2015-11-22 , "CUSTOM", "COMPANY1", "PERSONCUSTOM"
2015-11-23 , "AUTO", "COMPANY3", "PERSON3"

我想创建一个sql查询,只选择日期在2015年11月之内的行,也选择优先级来源" CUSTOM"超过"自动"如果它存在于公司,否则使用" AUTO"一。所以期望的输出是:

2015-11-22 , "CUSTOM", "COMPANY1", "PERSONCUSTOM"
2015-11-23 , "AUTO", "COMPANY3", "PERSON3"

如果这个方法太难在sql中完成,我可以将所有数据都抓到c#DataTable中并使用linq。如果有人可以为此提供一个例子,那就太好了! (不确定哪个更有效......)

2 个答案:

答案 0 :(得分:1)

每个公司只需要一行?然后按公司对结果进行分区,按源排序,然后仅选择每个分区中的顶行。

SELECT Date, Source, Company, Person,
    ROW_NUMBER() OVER (PARTITION BY Company 
        ORDER BY Source DESC) AS rk
FROM MyTable
WHERE MONTH(Date) = 11 AND YEAR(Date) = 2015
    AND rk = 1

我应该补充一点,如果你的表很大,你可能想要在日期字段上编制索引。在这种情况下,MONTH()和YEAR()函数不是按日期过滤的最有效方法。最好使用类似的东西:

WHERE Date >= @StartDate AND Date < DATEADD(month, 1, @StartDate)

答案 1 :(得分:0)

也许您可以使用以下查询

Select * 
From TABLE_NAME
Where DATE <= '30-11-2015' 
Order By COMPANY, SOURCE = 'CUSTOM' DESC