我试图从数据库中提取记录但是在构造查询的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'
最终结果理想情况下会返回此信息:
同样,最终目标是仅考虑在单个结算周期内附加单个帐户的服务地点。
再次感谢!
---------- 示例结果 ----------
答案 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