2013-06-14 2 views
1

У меня возникла следующая проблема.Запрос на выбор диапазона номеров

Я хотел бы выбрать значение валюты из базы данных, которое будет действовать как значение по умолчанию в верхнем результате запроса (эта часть уже выполнена и не является частью моей основной проблемы).

Я хочу использовать запрос, вид выглядит следующим образом:

SELECT valkurs, valkurs 'vk' 
FROM xx 
WHERE valkod='EUR' AND foretagkod=300 
UNION 
--(My problem is that i can't find out what to write here) 

Моя проблема заключается в том, что я хотел бы присоединить диапазон значений от 1,0 до 20,0 с 0,1 в дополнительных шагов для исходного запроса упомянутое выше.

Пример вывода может выглядеть следующим образом:

8.88, 8.88 

1.0, 1.0 

1.1, 1.1 

1.2, 1.2 

... 

20.0, 20.0 

Можно ли так или иначе?

Из-за проблемы реализации это должно быть сделано в запросе ...

+2

Pls перефразируйте ваш вопрос. Это непонятно. – Dhwani

+0

Вы могли бы показать свое фактическое значение, включая его значения? Это все еще немного расплывчато для меня. – Edper

+0

Необязательные значения, все ли значения от 1,0 до 20,0 шаг 0,1? –

ответ

3

Вы можете использовать таблицу Master..spt_values системы для создания последовательного списка:

SELECT Number = CAST(1 + (Number/10.0) AS DECIMAL(4, 1)), 
     Number2 = CAST(1 + (Number/10.0) AS DECIMAL(4, 1)) 
FROM Master..spt_values 
WHERE Type = 'P' 
AND  Number BETWEEN 0 AND 200 

Так, чтобы объединить в правильном порядке с текущим запросом я хотел бы использовать:

SELECT valkurs, VK = valkurs 
FROM ( SELECT valkurs, SortOrder = 0 
      FROM xx 
      WHERE valkod = 'EUR' 
      AND  foretagkod = 300 
      UNION ALL 
      SELECT valkurs = CAST(1 + (Number/10.0) AS DECIMAL(4, 1)), SortOrder = 1 
      FROM Master..spt_values 
      WHERE Type = 'P' 
      AND  Number BETWEEN 0 AND 190 
     ) T 
ORDER BY T.SortOrder, t.valkurs; 

ADDENDUM

Есть некоторые, которые не защищают использование Master..spt_values из-за того, что он не задокументирован, поэтому может удалить из будущих версий sql-сервера. Если это является серьезной проблемой вы можете использовать ROW_NUMBER() для создания последовательного списка (используя любую таблицу с достаточным количеством строк в качестве источника, я пошел за sys.all_objects):

SELECT valkurs, VK = valkurs, 
FROM ( SELECT valkurs, SortOrder = 0 
      FROM xx 
      WHERE valkod = 'EUR' 
      AND  foretagkod = 300 
      UNION ALL 
      SELECT TOP 191 
        valkurs = 1 + ((ROW_NUMBER() OVER(ORDER BY object_id) - 1)/10.0), 
        SortOrder = 1 
      FROM sys.all_objects 
     ) T 
ORDER BY T.SortOrder, t.valkurs; 
1

Старых, но я думаю, что некоторые люди выиграют от мой ответ, который является намного лучшей реализацией, чем принятый ответ

WITH e1(n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), -- 10 
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10 
e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2), -- 10*100 
numbers as (SELECT n = ROW_NUMBER() OVER (ORDER BY n)/10.0 
FROM e3) 
select n, n from numbers 
where n between 1 and 20 
Смежные вопросы