#sql #tsql
#sql #tsql
Вопрос:
Я хотел отобразить значения столбцов 3 таблиц (регистрация данных, температура, давление), как показано ниже, и мой запрос также показан ниже, но здесь значения температуры повторяются, я хочу все соответствующие значения для конкретной даты, как я могу это сделать? кто-нибудь может мне помочь, пожалуйста?
Таблицы являются
-
регистрация данных 5
name shift name operator id date plant line machi ------- ----------- --------- --- ----------------------- ------ ----- ----- ashwini shift1(7-3) Operator1 102 2011-06-07 00:00:00.000 Plant1 Line1 mc1 pradeep shift1(7-3) Operator1 101 2011-06-06 00:00:00.000 Plant1 Line1 mc1 ...
-
температура
temprature time date ---------- ----------------------- ------------------- 27 1900-01-01 15:45:41.000 2011-06-06 00:00:00 27.3 1900-01-01 15:50:41.000 2011-06-06 00:00:00 ...
-
давление
temprature time date ---------- ----------------------- ------------------- 0.5 1900-01-01 15:45:41.000 2011-06-06 00:00:00 0.7 1900-01-01 15:50:41.000 2011-06-06 00:00:00 ...
мой sql-запрос
select Date=convert(varchar(12),(t1.date),101), t1.time, operatorname,
machine, line, t2.time, Temprature, Pressure
from datalogging5 t
inner join temprature t1 on t1.date=t.date
inner join pressure t2 on t.date=t2.date order by t.date
Комментарии:
1. Схему базы данных из SQL было бы легче понять, чем все эти данные. Есть ли возможность сделать скриншот дизайна базы данных?
2. WraithNath прав. Нам нужны сценарии создания трех таблиц и инструкции INSERT для заполнения трех таблиц после их создания.
3. Я немного почистил материал, теперь его должно быть легче читать
4. Вам действительно не следует пытаться объединить ваши таблицы вместе, используя дату (и время?) поля (ы). Поле внешнего ключа в ваших таблицах temprature и pressure, ссылающееся на вашу таблицу регистрации данных, было бы лучшим способом
5. И если это не в рабочей среде, пожалуйста, пожалуйста, пожалуйста, исправьте написание temperature. Это сведет сопровождающих с ума.
Ответ №1:
Я не особенно свободно владею SQL, поэтому, если я делаю что-то не так, дайте мне знать, но не могли бы вы просто сделать что-то вроде:
SELECT CONVERT(varchar(12),(t1.date),101) AS Date, t1.time, t.operatorname,
t.machine, t.line, t2.time, t1.temprature, t2.pressure
FROM datalogging5 t
INNER JOIN temprature t1 ON t1.date=t.date
INNER JOIN pressure t2 ON t.date=t2.date
WHERE t.date = '2011-6-10'
ORDER BY t.date;
Вы могли бы заменить 2011-6-10
любым вашим поисковым запросом.
Что касается вашей проблемы с повторением температуры, я думаю, проблема в том, что вы пытаетесь соединить таблицы через столбцы даты. Существует вероятность того, что более чем одна запись данных или температуры имеет одну и ту же дату, и поэтому, когда вы запускаете свой запрос, он будет отображаться один раз для каждой записи, которой он соответствует, что делает ее похожей на дубликат.
В любом случае, дайте мне знать, соответствует ли этот код тому, что вы искали, или нет.
Ответ №2:
Вам необходимо объединить таблицы температуры и давления как по дате, так и по времени (поскольку они, по-видимому, хранятся в отдельных столбцах)
Select D.Date, T.Time...
From DataLoggings As D
Join Temperature As T
On T.Date = D.Date
Join Pressure As P
On P.Date = T.Date
And P.Time = T.Time
В вашей схеме и этом запросе есть некоторые ошибки:
- Время в таблице температур должно точно, с точностью до миллисекунды, совпадать со временем в таблице давления.
- У вас должны быть показания температуры и давления за заданное время, чтобы они были возвращены в списке. Один из способов обойти эту проблему — построить расписание секунд в день из чисел или таблицы подсчета, что является уродливым решением.
Вы могли бы рассмотреть таблицу измерений вместо отдельной таблицы для температуры и давления. Итак, что-то вроде:
Create Table Measurements
(
ReadingType varchar(15) not null
, Reading float not null
, Date date not null
, Time time not null
, Check( ReadingType In('Temperature','Pressure') )
)