我具有SQL Server的工作知识以及执行大多数基本查询的能力。但是,我被困住了,需要一些帮助。我有6个相关的表,我需要从中获取一组数据。
表格如下:
MTMeterReadings
先生
MTMeterReadingGroups
mg
MTMeterSources
ms
MTMeters
m
SCEquipment
eq
ARCustomers
c
我想要的结果集是显示MTMeterReadins表中每个实际记录的以下数据,其中mr.CreateDate> 'MM / DD / YYY':
mr.actual | mr.CreateDate | ms.description | e.EquipmentID | c.CustomerName
到目前为止,我已经能够创建一个包含c.CustomerName
所需的所有内容的查询,但似乎无法完全接受(我有时可能会受到挑战)。
非常感谢任何帮助。
我道歉,但我不知道我已经拥有的查询是否有帮助。
除了客户名称之外,以下是我所拥有的产品:
SELECT
mg.EquipmentID,
CAST(mr.Actual AS decimal(12, 0)) AS Meter,
CAST(mr.CreateDate AS DATE) AS MeterDate,
ms.MeterSource, m.Description
FROM
MTMeterReadings AS mr
INNER JOIN
MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID
INNER JOIN
MTMeterSources AS ms ON mg.MeterSourceID = ms.MeterSourceID
INNER JOIN
MTMeters AS m ON mr.MeterID = m.MeterID
WHERE
(mr.CreateDate >= '01/01/2014') AND (mr.CreateDate <= '02/20/2015')
ORDER BY
MeterDate DESC, mg.EquipmentID, m.Description
但是,我为添加CustomerName
所做的每次尝试都会产生mr
表中的多个记录。我无法确切地说出我的错误是什么,但我认为这是一个错误的连接。对于拥有比我更大的SQL大脑的人来说,这可能很简单,但是当我从SAMS“在10分钟内自学SQL”一书中学习SQL时,这远不是我的核心知识库。
答案 0 :(得分:0)
您缺少额外的2个联接:
SELECT mg.EquipmentID, CAST(mr.Actual AS decimal(12, 0)) AS Meter, CAST(mr.CreateDate AS DATE) AS MeterDate, ms.MeterSource, m.Description, ar.CustomerName
FROM MTMeterReadings AS mr INNER JOIN
MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID INNER JOIN
MTMeterSources AS ms ON mg.MeterSourceID = ms.MeterSourceID INNER JOIN
MTMeters AS m ON mr.MeterID = m.MeterID
INNER JOIN SCEquipment eq on mg.EquipmentID = eq.EquipmentID
INNER JOIN ARCustomers ar on eq.CustomerID = ar.CustomerID
WHERE (mr.CreateDate >= '01/01/2014') AND (mr.CreateDate <= '02/20/2015')
ORDER BY MeterDate DESC, mg.EquipmentID, m.Description
答案 1 :(得分:0)
应该这么简单:
SELECT mg.EquipmentID,
CAST(mr.Actual AS DECIMAL(12, 0)) AS Meter,
CAST(mr.CreateDate AS DATE) AS MeterDate,
ms.MeterSource,
m.Description
c.CustomerName
FROM MTMeterReadings AS mr INNER JOIN
MTMeterReadingGroups AS mg ON mr.MeterReadingGroupID = mg.MeterReadingGroupID INNER JOIN
MTMeterSources AS ms ON mg.MeterSourceID = ms.MeterSourceID INNER JOIN
MTMeters AS m ON mr.MeterID = m.MeterID INNER JOIN
SCEquipment AS e ON mg.EquipmentID = e.EquipmentID INNER JOIN
ARCustomers AS c ON e.CustomerID = c.CustomerID
WHERE (mr.CreateDate BETWEEN '01/01/2014' AND '02/20/2015')
ORDER BY MeterDate DESC,
mg.EquipmentID,
m.Description
但是假设没有可能的外部联接,并且您想要的每个关系都至少有一条记录。
另请注意,如果mr.CreateDate
为datetime
,您将在午夜后的2015年2月20日错过次数。