【发布时间】:2014-03-28 17:24:32
【问题描述】:
我对 SQL 还很陌生(大约 9 个月左右),所以我很难用 SQL Server 2012 来解决这个问题。
我正在尝试匹配两个如下所示的表格:
表Shift:
Date | Name | Shift
01-01-2013 | Dan Smith | Night
01-02-2013 |John Johnson| Night
01-03-2013 |John Johnson| Night
表Sales:
Date | Name | Sales
01-01-2013 | Dan Smith | 3
01-02-2013 | Dan Smith | 5
01-02-2013 |John Johnson| 4
01-03-2013 |John Johnson| 7
01-04-2013 |John Johnson| 2
问题是轮班表只包含轮班的开始日期,这对于夜班来说是个问题,因为它需要两天时间。夜班销售显示为在两天内发生,因为它们在发生时带有时间戳。这意味着,如果我只是尝试根据姓名和班次日期链接表格,而该人第二天没有班次,我将错过从上午 12:00 开始的任何销售数据。我正在寻找一种方法来检查该人第二天是否有班次,如果没有,则将他们第二天的销售数据添加到前几天的销售额中。
现在我的代码如下所示:
Select
st.Name,
st.Date,
st.Shift,
sl.Sales
From
Shift st
right join
Sales as sl on sl.Name = st.Name
and sl.Date = Case
When sl.Date = DATEADD(DD, 1, st.Date)
Then DATEADD(DD,1, st.Date)
Else st.Date
End
当我简单地使用 sales.date=shift.date 时,它会拾取丢失的数据,但最终也会产生大量重复数据。抱歉,如果这很简单,但我还没有找到一种好方法来简单地检查销售人员第二天是否没有轮班,然后将该人的第二天销售数据添加到他们前几天的销售数据中。
编辑:期望的结果看起来像这样:
ShiftDate | Name | Shift | Sales
01-01-2013 | Dan Smith | Night | 8
01-02-2013 |John Johnson| Night | 4
01-03-2013 |John Johnson| Night | 9
我真的不介意每班的准确销售数字是否不是 100% 准确,但如果他们第二天没有班次,我确实需要获取第二天的销售数据。
我很想改变模型,因为它绝对可以解决这个问题,并且已经努力获得一个一段时间了。不幸的是,销售数据来自外部来源,然后我将其导入我们的数据库,到目前为止,他们一直不愿意/无法提供精确的时间戳。
【问题讨论】:
-
Yakshemash !你不再是新人了。我只做 3 个月的 SQL :) 你的数据库需要包含所有时间戳。
-
你能发布想要的结果吗?
-
我们怎么知道如何将 John Johnson 的销售额分配给
01-03-2013?,您将其显示给01-03-2013班次,但也可以是您自己的01-02-2013规则 -
你不能,这就是为什么我希望找到一种方法来简单地根据销售日进行汇总,除非它是该人连续的最后一个班次,在这种情况下它将它添加到前一天。
标签: sql sql-server date