2015-02-25 3 views
1

У меня есть знание SQL Server, а также возможность выполнять большинство базовых запросов. Тем не менее, я застрял и нуждаюсь в некоторой помощи с этим. У меня есть 6 связанных таблиц, из которых мне нужно получить набор данных.SQL Statement - слишком глупый, чтобы понять это

Таблицы следующим образом:

MTMeterReadings МР-

  • Фактический
  • GroupID
  • MeterID
  • CreateDate

MTMeterReadingGroups мг

  • MeterReadingGroupID
  • MeterSourceID
  • EquipmentID

MTMeterSources мс

  • MeterSourceID
  • Описание

MTMeters м

  • MeterID
  • Описание

SCEquipment экв

  • EquipmentID
  • CustomerID

ARCustomers гр

  • CustomerID
  • CustomerName

Мой желаемый набор результаты, чтобы показать следующие данные для каждой фактической записи в таблице, где MTMeterReadins mr.CreateDate> «мм/дд/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, чем я, но это далеко не входит в мою основную базу знаний, когда я изучил SQL из книги SAMS «Teach Yourself SQL за 10 минут».

+0

Итак, вы собираетесь показать нам, что у вас есть до сих пор? –

+1

Если у вас есть первые четыре поля, кажется, что это еще одно соединение от SCEquipment с ARCustomers с использованием полей CustomerID. Есть ли еще какие-то осложнения? –

ответ

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 
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, вы пропустите время 20/20/2015 после полуночи.

+0

AhhHahh! За пределами пары опечаток с моей стороны для имен таблиц вы прибивали ее. Спасибо. В комментарии о дате, вы говорите, что «между» включает или не включает две даты? , , , Фактически, через пробную ошибку я вижу, что она включает дату начала, но не относится к дате окончания. Еще раз спасибо. –

+0

@ChrisZumwalt Нет, между is * always inclusive *, запрос, который я написал, логически идентичен вашему запросу (опечатки в стороне). Проблема в том, что ''02/20/2015'' переводит на дату и время '02/20/2015 00: 00: 00''. Если вы хотите, чтобы все между 01/01/2012 и 2/20/2015, и в поле времени есть время, вы должны сказать 'mr.CreateDate> = '01/01/2014 'AND mr.CreateDate <'02/21/2015''. Это «после полуночи 1 января или после нее, но до полуночи 21 февраля». В принципе: помните, что полночь - это начало дня! –

Смежные вопросы