【问题标题】:Day/Month filtered Sub Query日/月过滤子查询
【发布时间】:2017-11-02 11:18:05
【问题描述】:

我有这些当前结果

 PersonName Team    Daily Amount    Date
    Alex      4          10       2017-01-11
    Alex      4          10       2017-01-11
    Alex      4          10       2017-01-11
    Ben       1          10       2017-02-11
    Ben       1          10       2017-02-11
    Ben       1          10       2017-01-11
    Fred      3          10       2017-01-11
    Fred      3          10       2017-01-11
    Fred      3          10       2017-01-11
    Sam       2          10       2017-02-11
    Sam       2          10       2017-01-11
    Sam       2          10       2017-01-11
    Tom       2          10       2017-01-11
    Tom       2          10       2017-02-11
    Tom       2          10       2017-01-11

现在,我希望在两个单独的列中创建迄今为止的每日和每月数字。

我正在寻找这样的结果:

 PersonName Team    Daily Amount    Date        Monthly Figure
    Alex      4          30       2017-01-11      30
    Ben       1          10       2017-01-11      30
    Fred      3          10       2017-01-11      30
    Sam       2          20       2017-01-11      30
    Tom       2          20       2017-01-11      30

到目前为止,我有一个这样的查询,但我不确定这是最好的方法。它给了我与我预期不同的分组总和结果。

SELECT P.PersonName, min(P.Team) AS [Team],
SUM(F.Amount) AS [Daily Amount], min(F.Date) AS [Date], MTD.[Month To Date]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
WHERE DATEDIFF( d, F.Date, GETDATE() ) = 1 
GROUP BY P.PersonName


JOIN 
(SELECT 
P.PersonName, min(P.Team) AS [Team],
SUM(F.Amount) AS [Month To Date]
, min(F.Date) AS [Date]
FROM Person P
JOIN Figure F on P.PersonID =F.PersonFK
F.Date BETWEEN CAST(MONTH(GETDATE()) 
AS VARCHAR) + '/' + '01/' +  + CAST(YEAR(GETDATE()) AS VARCHAR)
AND  GETDATE() 
GROUP BY P.PersonName ) MTD
ON MTD.PersonName = P.PersonName

我已经尝试过加入子查询以及使用联合,但我无法完全得到我想要的结果。谁能给我进一步的建议?谢谢

SQL FIDDLE - http://sqlfiddle.com/#!6/23bbb/12

【问题讨论】:

  • “2017-02-11”发生了什么?
  • @GordonLinoff 我想将每日限制为 2017 年 1 月 11 日,但显示整个月的总数。我可以删除日期字段 - 它并不重要。它只是为了展示我正在努力实现的目标

标签: sql sql-server join group-by subquery


【解决方案1】:

如果我理解正确,您想找到每个人在特定日期的支出金额,并将其与该月的支出金额进行比较

declare @day date = '01-11-17'

select P.PersonName, 
    P.Team AS [Team],
   sum(case when date = @day then f.amount end) AS [daily amount] ,
   @day AS [Date],   
   sum(F.Amount) AS [monthly amount] 
from Person P
join Figure F on P.PersonID =F.PersonFK
where month(F.date) = month(@day)
group by P.PersonName, P.Team

demo

【讨论】:

  • 这是不对的。例如,汤姆的每月数字应该是 30 而不是 40
  • @RyanGadsdon 适合我演示中的数据。
  • @RyanGadsdon 请注意,在您的数据(您在小提琴中提供)中,您在一天内拥有所有 1 月份的数据,因此,每月和每日数据之间没有区别。所以我添加了两个值,Tom 一月份的总数为 40。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-06-02
相关资源
最近更新 更多