2010-08-22 13 views
2

Предполагая wagetable:Выбор самой высокой зарплаты

name  lowhours highhours wage 
Default 0.0  40.0  100 
Default 40.0  50.0  150 
Default 50.0  70.5  154 
Default 70.5  100.0  200 
Brian 0.0  40.0  200 
Brian 40.0  50.0  250 
Brian 50.0  60.0  275 
Brian 60.0  70.0  300 
Brian 70.0  80.0  325 
Brian 80.0  9999.0  350 
Chad  0.0  40.0  130 
Chad  40.0  9999.0  170 

В настоящее время я использую этот код (AutoIT сценарии:

func getCurrentWage($Employee, $Hour_number) 
    Dim $row 
    Local $Wage = 0 
    Local $Found = "found" 
    _SQLite_QuerySingleRow(-1, "SELECT wage FROM wagetable WHERE name LIKE " & _SQLite_Escape($Employee) & " AND " & _SQLite_Escape($Hour_number) & " BETWEEN lowhours AND highhours;", $row) 
    if @error then 
     _SQLite_QuerySingleRow(-1, "SELECT wage FROM wagetable WHERE name LIKE 'Default' AND " & _SQLite_Escape($Hour_number) & " BETWEEN lowhours AND highhours;", $row) 
     $Found = "not found" 
    endif 

    If ($row[0] == "") Then Msgbox(0,0,"Error getCurrentWage") 
    $Wage = $row[0] 

    Debug("Wage='" & $Wage & "' because " &$Employee&" was "& $Found& " -- and Hours Elapsed is " & $Hour_number, true) 
    return $Wage 
EndFunc 

Так эти 2 запросов совершенны, если Hour_number находится между ними низким часом Высокие часы. Мне нужен какой-то запрос, где он будет в основном делать что-то вроде:

SELECT wage from wagetable WHERE name LIKE $Employee AND max(highhours) 

, а затем просто повторите его для «По умолчанию», сотрудник не найден.

Дополнительно: Можно ли попробовать «По умолчанию», если $ Employee не найден только с одним запросом?

ответ

1

Можно ли попробовать «По умолчанию», если $ Employee не найдено только с одним запросом?

SELECT name, wage, highhours 
    FROM wagetable 
    WHERE name like 'Brian' OR 
     name like 'Default' 
ORDER BY name, 
     highhours desc 

Этот запрос работает при запросе Brian, но для того, чтобы работать с любым именем Default должны храниться в базе данных, начиная с символа [email protected], потому что цифры и буквы приходят первые в сортировке.

Другой способ для вас, чтобы создать еще один столбец таблицы, для нашего аргумента, называется priority который должен иметь значение 0 для Default и 1 для любого другого пользователя. Тогда вы могли бы просто сделать:

SELECT name, wage, highhours 
    FROM wagetable 
    WHERE name like 'Brian' OR 
     name like 'Default' 
ORDER BY priority desc, 
     highhours desc 

Конечно, это же решение, но это лучший подход, чем полагаться на специальный символ в имени значения по умолчанию.

+0

Спасибо за подробный ответ. Я стану приоритетом, потому что этот процесс кажется самым простым. – ParoX

+1

Несомненно, нет необходимости в новой колонке. 'ORDER BY CASE КОГДА name = 'default' THEN 1 ELSE 0 END DESC, highhours desc' сделает то же самое? –

+1

@Martin Очень приятно. Я думаю, что было бы проще установить 1 или 0 в начале, когда таблица инициализируется, а не запускать if else в каждом запросе. Я уверен, что разница в производительности небольшая, но я буду запускать этот запрос 3-4 раза за 1 секунду. – ParoX

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