2013-07-22 2 views
0

Недавно я написал веб-сайт, в котором используется база данных mysql as, и теперь я хочу изменить свою базу данных на SQL-сервер, но у меня так много проблем с моими запросами ... Я бы было сказано, что запросы mysql и sql-сервера похожи друг на друга, но я не могу представить этого!Эквивалент запроса от mysql в sql-сервере

SELECT 
    datos.NumEstacion, MAX(datos.Fecha), datos.NumFuncion, datos.Valor, parametros_mi.nombre AS NombreParametro, funciones_mi.Nombre AS NombreFunction 
FROM 
    (datos JOIN parametros_mi ON datos.NumParametro=parametros_mi.NumParametro) JOIN funciones_mi ON datos.NumFuncion=funciones_mi.NumFuncion 
WHERE 
    datos.NumEstacion=1844 AND ((parametros_mi.nombre, funciones_mi.Nombre) IN (('Battery Level', 'Avg.'), ('Relative Humidity', 'Avg.'), ('Rain', 'Accu'), ('Air Temperature', 'Avg.'), ('Wind Speed', 'Avg.'), ('Wind Direction', 'Avg.'), ('Atmosferic Pressure', 'Avg.'), ('Global Radiation 1', 'Avg.'), ('Visibility', 'Ins.'), ('Snow Level', 'Avg.'), ('Present Weather', 'Ins.'), ('IRS Road Temperature', 'Avg.'), ('IRS Salt Concentration', 'Avg.'), ('IRS Freezing Temperature', 'Avg.'), ('IRS Water Film', 'Avg.'), ('IRS Road Condition', 'Ins.'), ('IRS Up Ground Temperature', 'Avg.'), ('IRS Down Ground Temperature', 'Avg.'), ('ARS Freezing Temperature', 'Avg.'), ('ARS Road Temperature', 'Avg.'), ('ARS Freezing Temperature Corrected', 'Avg.'), ('Freezing Prediction 2 Hours', 'Ins.'), ('IDI Road Condition', 'Ins.'), ('IDI Road Temperature', 'Avg.'))) 
GROUP BY 
    datos.NumParametro, datos.NumFuncion 
+0

Итак, что же вы хотите, как выход? – Novice

+0

У меня есть таблица данных, в которой есть данные о температуре воздуха, ветре и других аэрологических данных с момента их захвата. но тип этих данных находится в других таблицах (parametros_mi и funciones_mi), и есть внешний ключ с номером типа для datos. Я хочу последнее значение некоторых типов, которые некоторые из них указаны в разделе IN. – Ehphan

ответ

1

Вы должны изменить

(parametros_mi.nombre, funciones_mi.Nombre) IN (('Battery Level', 'Avg.'), ...) 

в

(parametros_mi.nombre = 'Battery Level' AND funciones_mi.Nombre = 'Avg.') OR ... 

и вы должны использовать агрегатные функции (MAX(), MIN() и т.д.) на столбцы в списке выбора, которые не являются частью группы или включить их в группу.

Попробуйте

SELECT 
    MAX(datos.NumEstacion), 
    MAX(datos.Fecha), 
    datos.NumFuncion, 
    MAX(datos.Valor), 
    MAX(parametros_mi.nombre) AS NombreParametro, 
    MAX(funciones_mi.Nombre) AS NombreFunction 
FROM 
    datos JOIN parametros_mi 
ON datos.NumParametro=parametros_mi.NumParametro JOIN funciones_mi 
ON datos.NumFuncion=funciones_mi.NumFuncion 
WHERE 
    datos.NumEstacion=1844 
    AND 
    ((parametros_mi.nombre = 'Battery Level' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Relative Humidity' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Rain' 
    AND funciones_mi.Nombre = 'Accu') OR 
    (parametros_mi.nombre = 'Air Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Wind Speed' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Wind Direction' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Atmosferic Pressure' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Global Radiation 1' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Visibility' 
    AND funciones_mi.Nombre = 'Ins.') OR 
    (parametros_mi.nombre = 'Snow Level' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Present Weather' 
    AND funciones_mi.Nombre = 'Ins.') OR 
    (parametros_mi.nombre = 'IRS Road Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'IRS Salt Concentration' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'IRS Freezing Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'IRS Water Film' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'IRS Road Condition' 
    AND funciones_mi.Nombre = 'Ins.') OR 
    (parametros_mi.nombre = 'IRS Up Ground Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'IRS Down Ground Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'ARS Freezing Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'ARS Road Temperature' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'ARS Freezing Temperature Corrected' 
    AND funciones_mi.Nombre = 'Avg.') OR 
    (parametros_mi.nombre = 'Freezing Prediction 2 Hours' 
    AND funciones_mi.Nombre = 'Ins.') OR 
    (parametros_mi.nombre = 'IDI Road Condition' 
    AND funciones_mi.Nombre = 'Ins.') OR 
    (parametros_mi.nombre = 'IDI Road Temperatu 
    re' AND funciones_mi.Nombre = 'Avg.')) 
GROUP BY 
    datos.NumParametro, datos.NumFuncion 
+0

Я думаю, что мне нужно что-то сделать с максимальной функцией. Он вызывает следующую ошибку: столбец «datos.NumEstacion» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. – Ehphan

+1

Точно. В отличие от MySql, все основные RDBMS не позволяют использовать столбцы в select, которые не входят в группу, или в какой-либо агрегатной функции. – peterm

+0

Спасибо, это сработало! Но у меня есть еще один вопрос @peterm. если я хочу использовать AVG, должен ли все выбрать AVG? или я должен использовать другие? – Ehphan

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