不确定如何将两个工作查询连接在一起

时间:2013-06-14 09:38:16

标签: sql sql-server database sql-server-2005 select

我有两个完美运行的查询。我想一起加入这两个问题,但我无法弄清楚如何做到这一点。

我有一个SQL Server表,结构如下:

Table name : calendar. 

专栏:

Calendar Date (smalldatetime)
Working Day (bit)

日历日期包含所有日期,格式为yyyy-mm-dd。工作日意味着我有工作,如果它是1,如果是周末或假日,它被标记为0:)。

我要检索的内容示例:

CalendarDate   NumWorkingDaysInMonthSoFar   NumWorkingDaysInThisMonthTotal
------------------------------------
2013-06-01    0 (--Due to this being marked a 0 as above (Saturday))      22
2013-06-02    0 (--Due to this being marked a 0 as above (Sunday) -- All 3 of these dates marked as 0)                22
2013-06-03    1 (--Due to this being marked a 0 as above (Bank Holiday))          22
2013-06-04    1             22
2013-06-05    2             22
2013-06-06    3             22

我有两个问题要分别做这两件事,但我很难弄清楚如何将两者结合起来产生上面的结果集。

这是返回NumberWorkingDaysInThisMonthTotal的查询(示例中为22,每个月应该是不同的值):

SELECT 
SUM(WorkingDay) As NumWorkingDaysInThisMonthTotal
FROM [calendar]
GROUP BY YEAR(CalendarDate), MONTH(CalendarDate) 

并返回每个月到目前为止的工作日数(每个工作日加一个,每个月初重置):

select c.[CalendarDate],
       (select sum(cast(WorkingDay as int))
        from calendar c2
        where year(c.[CalendarDate]) = year(c2.[CalendarDate]) and
              month(c.[CalendarDate]) = month(c2.[CalendarDate]) and
              c2.[CalendarDate] <= c.[CalendarDate]
       ) as NumWorkingDaysInMonthSoFar
from calendar c

如何将这些结合起来产生上面的结果集?我真的很感激你在如何做到这一点的过程中得到一些信息 - 在这个具体案例中都是如此;在你获得SQL背景的地方,我可以提高自己。非常感谢。

2 个答案:

答案 0 :(得分:2)

您应该能够使用窗口分析函数,如下所示:

select c.[CalendarDate],
       SUM(WorkingDay) over (partition by YEAR(CalendarDate), MONTH(CalendarDate))
          As NumWorkingDaysInThisMonthTotal,
       (select sum(cast(WorkingDay as int))
        from calendar c2
        where year(c.[CalendarDate]) = year(c2.[CalendarDate]) and
              month(c.[CalendarDate]) = month(c2.[CalendarDate]) and
              c2.[CalendarDate] <= c.[CalendarDate]
       ) as NumWorkingDaysInMonthSoFar
from calendar c

答案 1 :(得分:1)

这可能不是最有效的方法,但是你可以把你的第一个查询作为第二个查询的子查询(它也是未经测试的,所以这完全有可能这会让你的丝绸价格上周三在廷巴克图的豆腐而不是你想要的东西):

select c.[CalendarDate],
   (SELECT SUM(C3.WorkingDay)
    FROM Calendar C3
    WHERE month(C3.CalendarDate) = month(c.CalendarDate)
      AND year(C3.CalendarDate) = year(c.CalendarDate)
   ) AS NumWorkingDaysInThisMonthTotal,
   (select sum(cast(WorkingDay as int))
    from calendar c2
    where year(c.[CalendarDate]) = year(c2.[CalendarDate]) and
          month(c.[CalendarDate]) = month(c2.[CalendarDate]) and
          c2.[CalendarDate] <= c.[CalendarDate]
   ) as NumWorkingDaysInMonthSoFar
from calendar c

它甚至可能足够快到你的目的。

当你提出一些思考过程的解释时,当我开始考虑两个我想要组合的查询时,就会出现这种解决方案,好像它们都被定义为视图,或者两者都有恰好兼容的数据集但是在不同的表格中。那我怎么把他们加在一起呢?

我确实倾向于使用纯子查询以不同于我使用视图的方式做事情,但是考虑这种方式可以帮助我弄清楚子查询应该是什么。我喜欢考虑采集一些数据并将它们粘在一起,因为它可以帮助我弄清楚我实际在做什么。

不可否认,我可能会研究它一段时间,然后想出一些方法将它统一到一个更有效的解决方案中。首次尝试通常不是最有效的,显然有很多情况下查询的速度很重要,但是一开始对我来说,获得正确的答案是最重要的。