分组到第一天的第一天,并加入一个单独的表

时间:2017-12-12 06:56:10

标签: sql sql-server

我在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

请帮助我,我是一个新手编码,这是我的头脑.. :)

5 个答案:

答案 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