1

我有 4 个表:
表 A:

|LineID|

表 B:

|Date|ShiftID|IsWorking|

表 C:

|LineID|Date|ShiftID|IsWorking|

表 D:

|ShiftID|HowLongWorks|

我需要创建一个视图

|LineID|Date|HowLongWorks|

在这个视图中,我需要:
- 表 A 中的所有行 -
表 B 中每一行的所有日期
- 所有班次的总和(HowLongWorks)签名到 IsWorking = 1 的日期

而当C表中存在LineID、Date、ShiftID组合时,IsWorking必须取自表C,如果不存在则取自表B。

是否可以在视图中进行?

例如:表A:

|Line 1|
|Line 2|

表 B:

|2013-01-01|1|1|
|2013-01-01|2|1|
|2013-01-02|1|1|
|2013-01-02|2|0|
|2013-01-03|1|0|
|2013-01-03|2|0|

表 C:

|Line 1|2013-01-01|1|0|
|Line 1|2013-01-01|2|0|
|Line 1|2013-01-02|1|1|
|Line 2|2013-01-03|2|1|

表 D:

|1|8|
|2|10|

视图中的结果应该是:

|Line 1|2013-01-01|0|
|Line 1|2013-01-02|8|
|Line 1|2013-01-03|0|
|Line 2|2013-01-01|18|
|Line 2|2013-01-02|8|
|Line 2|2013-01-03|10|
4

1 回答 1

1
select
    a.LineID, b.Date,
    sum(case when isnull(c.IsWorking, b.IsWorking) = 1 then d.HowLongWorks else 0 end) as HowLongWorks
from TableA as a
    cross join TableB as b
    left outer join TableC as c on
        c.LineID = a.LineID and c.Date = b.Date and c.ShiftID = b.ShiftID 
    left outer join TableD as d on d.ShiftID = b.ShiftID
group by a.LineID, b.Date
order by LineID, Date

sql fiddle demo

于 2013-09-11T17:45:57.840 回答