我在SQL中有2个表 一个月度销售目标:
Date Target
1/7/17 50000
1/8/17 65000
1/9/17 50000
1/10/17 48000
etc...
另一个销售订单:
TxnDate JobNum Value
3/7/17 100001 20000
3/7/17 100002 11000
8/7/17 100003 10000
10/8/17 100004 15000
15/9/17 100005 20000
...等 我想要的是一张包含以下内容的表格:
Date Target Sales
1/7/17 50000 41000
1/8/17 65000 15000
1/9/17 50000 20000
请帮助我,我是一个新手编码,这是我的头脑.. :)
答案 0 :(得分:1)
假设您的第一个表是targetSales,而您的第二个表是Sales 和,您的数据库是SQL Server:
select
t.date
, t.target
, isnull(sum(s.value), 0) as Sales
from targetSales t
left join Sales s
on (month(t.date) = month(s.date)
and year(t.date) = year(s.date))
group by t.date
, t.target
如果您使用其他数据库,则可以使用类似的方法,只需为您的RDBMS找到month()
和year()
函数的等效项。
答案 1 :(得分:0)
试试这个
select tb1.date,tb1.target,tb2.value from table1 as tb1
INNER JOIN (select sum(value) as sales, date from table2 group by date) as tb2
on tb1.date = tb2.date,
您可以将此脚本用于每日目标
答案 2 :(得分:0)
这不是最好的解决方案,但这会给你一个正确的结果。
select date,target,(
select sum(value)
from sales_orders s
where datepart(m,s.TxnDate) = datepart(m,targets.Date)
and datepart(year,s.TxnDate) = datepart(year,targets.Date)
) as sales
from targets
答案 3 :(得分:0)
另一种方式是,在target
表格中,日期始终是该月的第一天。因此,在sales
表中,只需将TxnDate
列值舍入到该月的第一天。
<强>查询强>
select t1.[date],
max(t1.[target]) as [target],
coalesce(sum(t2.[value]), 0) as [value]
from [targets] t1
left join [sales] t2
on t1.[Date] = dateadd(day, - datepart(day, t2.[txnDate]) + 1, t2.[txnDate])
group by t1.[Date];
<强> demo 强>
答案 4 :(得分:0)
如果您在SQL Server中使用任何日期时间值,请计算从该日期到零datediff(month,0,TxnDate)
的月数,然后将该数量的飞蛾添加到零dateadd(month, ... , 0)
,您将获得该月的第一天原始日期时间值。这适用于所有版本的SQL Server。有了这个,我们可以在一个月的第一天将订单的价值加起来,然后使用该日期加入目标。
CREATE TABLE Orders ([TxnDate] datetime, [JobNum] int, [Value] int) ; INSERT INTO Orders ([TxnDate], [JobNum], [Value]) VALUES ('2017-07-03 00:00:00', 100001, 20000), ('2017-07-03 00:00:00', 100002, 11000), ('2017-07-08 00:00:00', 100003, 10000), ('2017-08-10 00:00:00', 100004, 15000), ('2017-09-15 00:00:00', 100005, 20000) ; CREATE TABLE Targets ([Date] datetime, [Target] int) ; INSERT INTO Targets ([Date], [Target]) VALUES ('2017-07-01 00:00:00', 50000), ('2017-08-01 00:00:00', 65000), ('2017-09-01 00:00:00', 50000), ('2017-10-10 00:00:00', 48000) ; GO
9 rows affected
select dateadd(month,datediff(month,0,TxnDate), 0) month_start, sum(Value) SumValue from Orders group by dateadd(month, datediff(month,0,TxnDate), 0) GO
month_start | SumValue :------------------ | -------: 01/07/2017 00:00:00 | 41000 01/08/2017 00:00:00 | 15000 01/09/2017 00:00:00 | 20000
select t.[Date], t.Target, coalesce(o.SumValue,0) from targets t left join ( select dateadd(month,datediff(month,0,TxnDate), 0) month_start, sum(Value) SumValue from Orders group by dateadd(month, datediff(month,0,TxnDate), 0) ) o on t.[Date] = o.month_start GO
Date | Target | (No column name) :------------------ | -----: | ---------------: 01/07/2017 00:00:00 | 50000 | 41000 01/08/2017 00:00:00 | 65000 | 15000 01/09/2017 00:00:00 | 50000 | 20000 10/10/2017 00:00:00 | 48000 | 0
dbfiddle here