日期:2014-05-18  浏览次数:20594 次

关于聚合的问题
DeptID PeriodID MenCount shiftID weekid AppointTime AlreadyCount 
NULL NULL 3 10 3 NULL 1
NULL NULL 3 3 3 NULL 2
NULL NULL 10 10 10 NULL 1
NULL NULL 20 8 3 NULL 1
NULL NULL 22 10 1 NULL 1
NULL NULL 23 11 2 NULL 1
NULL NULL 25 8 4 NULL 1
NULL NULL 30 19 3 NULL 1
NULL NULL 30 8 3 NULL 1
NULL NULL 33 10 2 NULL 1
NULL NULL 40 8 3 NULL 1
NULL NULL 44 10 1 NULL 1
NULL NULL 50 19 4 NULL 1
NULL NULL 55 19 5 NULL 1
NULL NULL 55 9 4 NULL 1
NULL NULL 88 10 1 NULL 1
NULL NULL 88 10 7 NULL 1
NULL NULL 88 9 1 NULL 1
NULL NULL 345 6 1 NULL 2
3 1 25 8 4 2012-02-02 00:00:00.000
3 2 25 8 4 2012-02-02 00:00:00.000

SQL code

declare @AppointTime datetime,@DeptID Nvarchar(50),@ShiftID Nvarchar(50),@WeekID Nvarchar(50)
set @deptID='3'
set @AppointTime='2012-2-2'
set @ShiftID='8'
set @WeekID='4'

select count(*) AlreadyCount,app.Deptid,app.PeriodID,sd.MenCount ,shiftID ,sd.WeekID,app.AppointTime
from  ShiftDetail sd left join AppointList App
on sd.ShiftID=@ShiftID and sd.WeekID=@WeekID  and  app.PeriodID=sd.PeriodID  and  app.AppointTime=@AppointTime
group by  app.AppointTime,app.DeptID,app.PeriodID ,sd.MenCount,shiftID,sd.WeekID
order by app.periodID




我都指定 @ShiftID='8' @WeekID='4',为什么结果里边这么多不符合的






------解决方案--------------------


好多null,好壮观啊
------解决方案--------------------
因为 left join
------解决方案--------------------
on,where毫无疑问可以一起使用。

a left join b 结果:a全集, b交集
on:ab相交条件,决定b返回什么数据,如无where条件a肯定全部返回。
where:对left join结果进一步筛选。

我所说的逻辑就是你希望a如何b相交(on条件),最后期望得到什么数据(where条件)。

------解决方案--------------------
探讨

引用:
引用:

引用:
因为 left join


那么要怎么样才能左链接,同时 @ShiftID='8' @WeekID='4'也成立


在于你要什么结果,left join的目的或者说逻辑是什么,下面不一定是你要的结果:


SQL code
on /*sd.ShiftID=……

------解决方案--------------------
好好看看再改。
------解决方案--------------------
我建议楼主先执行
SQL code

select app.Deptid,app.PeriodID,sd.MenCount ,shiftID ,sd.WeekID,app.AppointTime
from  ShiftDetail sd left join AppointList App
on sd.ShiftID=@ShiftID and sd.WeekID=@WeekID  and  app.PeriodID=sd.PeriodID  and  app.AppointTime=@AppointTime

------解决方案--------------------
select count(*) AlreadyCount,app.Deptid,app.PeriodID,sd.MenCount ,shiftID ,sd.WeekID,app.AppointTime
from ShiftDetail sd inner join AppointList App
on sd.ShiftID=@ShiftID and sd.WeekID=@WeekID and app.PeriodID=sd.PeriodID and app.AppointTime=@AppointTime
group by app.AppointTime,app.DeptID,app.PeriodID ,sd.MenCount,shiftID,sd.WeekID
order by app.periodID