首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问一个较复杂的查询有关问题

2012-12-17 
请教一个较复杂的查询问题有一个医疗的数据库,里面是所有人的医疗记录我想查询一段时间以内,一个人在同一

请教一个较复杂的查询问题
有一个医疗的数据库,里面是所有人的医疗记录

我想查询一段时间以内,一个人在同一个医院就诊多次的情况,并按医院来计数

这个查询我能做出来,但有一个问题,就是有的医院没有这种情况的,我在Linq里就显示不出来,而SSMS能(rightjoin很方便)

具体请看代码,SQL的:
select yymc,grbh,count(grbh)as'num' into temp6 --存到临时表
from nb_bxjl join NB_YYZD on NB_BXJL.BXD = NB_YYZD.YYBH
where czrq <='2012-03-31 23:59:59.999' 
and czrq >='2012-01-01 00:00:00.000'
and glzf is null 
and bxlx=2
and bxd in(select yybh from nb_yyzd where jgdm=2 )
group by yymc,grbh having count(grbh)>1 

select NB_YYZD.yymc,sum(num) from temp6 right join NB_YYZD
on temp6.yymc=NB_YYZD.YYMC
where NB_YYZD.JGDM=2
group by NB_YYZD.yymc

--------------------------------------------------------------------
Linq的:
var con =
                      from b in db.NB_BXJL
                      join y in db.NB_YYZD on b.BXD equals y.YYBH
                      where y.YYDJ == "2"
                      && b.GLZF.HasValue == false
                      && b.BXRQ >= dateTimePickerBegin.Value
                      && b.BXRQ <= dateTimePickerEnd.Value
                      && b.BXLX == 2
                      group b by new { name = b.BXD, grbh = b.GRBH } into c
                      where c.Count() > 1--查出符合的人
                      from a in c
                      join h in db.NB_YYZD on a.BXD equals h.YYBH into z
                      from x in z.DefaultIfEmpty()
                      group x by x.YYMC;

 foreach (var item in con)
                {
                    DataRow dr = dt.NewRow();
                    dr[0] = item.Key;


                    dr[1] = item.Count() > 0 ? item.Count() : 0;
                    dt.Rows.Add(dr);
                }

dataGridView1.DataSource = dt;

运行结果请看图:


-----------------------------------------------------------------------
我希望LINQ查询也能把所有医院显示出来,人次空的计0

请帮我看看该如何实现,想了很久都没成功,故来请教高手
[最优解释]
是呀,SQL有Right Join,你没有当然就不同了。

看看下面的代码,先把SQL中Right Join的数据来(query),然后通过FirstOrDefault在已经建立的con中查找匹配项,没有的话就按0处理了。


var query = from row in db.NB_YYZD where row.JGDM==2 select new {Name = row.yymc};

foreach(var name in query)
{
  DataRow dr = dt.NewRow();
  dr[0] = name;
  var item = con.FirstOrDefault(n => n.Key == name);
  dr[1] = item != null ? item.Count() : 0;
  dt.Rows.Add(dr);
}

[其他解释]
引用:
是呀,SQL有Right Join,你没有当然就不同了。

看看下面的代码,先把SQL中Right Join的数据来(query),然后通过FirstOrDefault在已经建立的con中查找匹配项,没有的话就按0处理了。

C# code

var query = from row in db.NB_YYZD where row.JGDM==2 select new {Name = ……


首先感谢你的回复,你的代码我看懂了,但不知为何,这么查询出来,所有的计数都是0,也就是说,所有的item都是空的,是哪里的问题呢
[其他解释]
var item = con.FirstOrDefault(n => n.Key == item.Name);

解决了,你的算法令我开拓了思路,非常感谢

热点排行