SQL Where语句在同一个月检查其他记录

时间:2015-07-07 14:02:48

标签: sql sql-server where-clause

我试图从数据库中提取记录但是在构造查询的WHERE子句时遇到了问题。

我有一个数据库,其中包含与服务位置相关联的帐户。随着时间的推移,帐户会发生变化,但服我想要完成的是一个查询,它返回服务位置只附加一个帐户的所有记录。

以下是代码示例,它并不是我所需要的。

SELECT
c.account_num,
MONTH(fb.[End]) AS 'Month', 
YEAR(fb.[End]) AS 'Year', 
AVG(fb.eDays) AS 'Billing Days'

FROM 
DimServiceLocation AS sl
INNER JOIN FactBill AS fb ON fb.ServiceLocationKey = sl.ServiceLocationKey
INNER JOIN DimCustomer AS c ON c.CustomerKey = fb.CustomerKey

WHERE 
AND fb.eDays IN (28, 29, 30, 31, 32, 33, 34, 35)
AND c.class_name = 'Customer' 
AND (fb.[End] > DATEADD(m, - 24, GETDATE()))

WHERE子句定义" eDays"的数量。 (结算日)和class_name(客户)。以这种方式存在问题(例如:如果一个月有33个结算日,它将返回附加到某个位置29天的客户,这将不是整个月的帐户持有人)。

我不知道如何实现这一目标。我觉得解决方案可能是通过特定的账单周期检查服务位置(由名为period_num的字段定义),然后仅查询那个period_num期间只有一个account_num的服务位置。

任何帮助将不胜感激。

---------- 已更新 ----------

我错误地遗漏了原始问题的重要部分。向那些帮助过的人道歉。问题的第二部分如下:

在原始的select语句中,我还需要返回在所有类似服务位置的单个时段内计费的平均 Usage 。这些代码行将被添加:

SELECT
c.account_num, 
sl.[Floorplan Name],
CONVERT(DECIMAL(5,0), AVG(EUsage)) AS 'Average Electric Usage',
COUNT(DISTINCT sl.location_id) AS 'Service Locations', 
MONTH(fb.[End]) AS 'Month', 
YEAR(fb.[End]) AS 'Year', 
AVG(fb.eDays) AS 'Billing Days'

最终结果理想情况下会返回此信息:

  • 平面图名称
  • 期间的平均使用量
  • 用于确定此平均值的服务地点数
  • 月份&这一时期结束了。
  • 本月的平均结算天数(基本上是本月的帐单天数,因为所有使用的帐户都应具有相同的帐单天数)。

同样,最终目标是仅考虑在单个结算周期内附加单个帐户的服务地点。

再次感谢!

---------- 示例结果 ----------

Sample Results

1 个答案:

答案 0 :(得分:1)

我认为这是您需要的查询,尽管一些示例数据和预期输出肯定会让事情变得更加确定:

SELECT
    c.account_num
    , MONTH(fb.[End]) AS 'Month', 
    , YEAR(fb.[End]) AS 'Year'
    , AVG(fb.eDays) AS 'Billing Days'
FROM DimServiceLocation AS sl
    INNER JOIN FactBill AS fb ON fb.ServiceLocationKey = sl.ServiceLocationKey
    INNER JOIN DimCustomer AS c ON c.CustomerKey = fb.CustomerKey
WHERE 
    AND fb.eDays IN (28, 29, 30, 31, 32, 33, 34, 35)
    AND c.class_name = 'Customer' 
    AND (fb.[End] > DATEADD(m, - 24, GETDATE()))
GROUP BY c.account_num
    , MONTH(fb.[End]
    , YEAR(fb.[End])
HAVING COUNT(DISTINCT c.account_num) = 1