Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос!  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Добрый день!
Необходимо вывести числа от 1 до 100 по следующему алгоритму:
если число кратно 3, то вывести 'F'
если число кратно 5, то вывести 'B'
если число кратно и 3 и 5, то вывести 'FB'
во всех остальных случаях вывести само число.
Помогите! Никак не соображу, что писать!

+ !не нажимай плюс!

!ты проиграл!
5 минут на прочтение статьи, 1 минута на написание кода, 10 на красивости...
WITH
n AS (
  SELECT
    [n] = 1
  UNION ALL
  SELECT
    [n] = [n] + 1
  FROM
    n
  WHERE
    [n] < 100
),
n2 AS (
  SELECT
    [n],
    [v] = CONVERT( VARCHAR, [n] ),
    [m3] = CASE WHEN [n] % 3 = 0 THEN 'Ой' ELSE '' END,
    [m5] = CASE WHEN [n] % 5 = 0 THEN 'Всё' ELSE '' END
  FROM
    n
)
SELECT
  [n],
  [w] = ISNULL( NULLIF( [m3] + [m5], '' ), [v] )
FROM
  n2

хитрожопый макак (c) Glory
18 май 17, 11:38    [20492348]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Руслан Дамирович, оригинальной статье уже десять лет исполнилось, а некоторые в первый раз ее для себя открыли, похоже.

https://blog.codinghorror.com/why-cant-programmers-program/

Вы ее, кстати, на бумаге писали, как того требует автор статьи?
18 май 17, 11:43    [20492367]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
CASE WHEN n%3 = 0 THEN 'F' ELSE '' END  + 
CASE WHEN n%5 = 0 THEN 'B' ELSE '' END  +
CASE WHEN n%3 <> 0 AND  n%5 <> 0 THEN CAST(n as VARCHAR(2)) END  
18 май 17, 11:45    [20492374]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
Добрый Э - Эх
Guest
Руслан Дамирович,

case выполняется до первого true условия. как только стрельнула одна ветка WHEN, последующие уже не проверяются . поэтому выстрой проверку в таком порядке:

WHEN [n] % 3 = 0 and [n] % 5 = 0 then 'FB'
WHEN [n] % 3 = 0 then 'F'
WHEN [n] % 5 = 0 then 'B'
else [n]

и, наверное/, будет тебе счастье
18 май 17, 11:45    [20492376]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
iiyama
Member

Откуда:
Сообщений: 642
Руслан Дамирович,

Руслан Дамирович,

Сегодня вроде не пятница, я что-то пропустил?
18 май 17, 11:45    [20492377]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TaPaK,

непонятно почему я решил varchar(2) :)
18 май 17, 11:46    [20492378]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
iiyama
Member

Откуда:
Сообщений: 642
Добрый Э - Эх,

спасибо, теперь догнал, а то я уж грешным делом подумал, что где-то наливают, а я не в курсе :)
18 май 17, 11:49    [20492388]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Задача по-прежнему не решена!
Ну же! Мне скоро билет отвечать!
Где картакод, Билли?

Не пятница, просто делать нечего...
18 май 17, 12:23    [20492503]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович
Задача по-прежнему не решена!
Ну же! Мне скоро билет отвечать!
Где картакод, Билли?

Не пятница, просто делать нечего...
что там ещё не решено?
18 май 17, 12:26    [20492513]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
o-o
Guest
TaPaK
Руслан Дамирович
Задача по-прежнему не решена!
Ну же! Мне скоро билет отвечать!
Где картакод, Билли?

Не пятница, просто делать нечего...
что там ещё не решено?

там n не откастили в строку, наверное
with nums as
(
select number as n
from master..spt_values
where type = 'p' and number between 1 and 100
)

select n,
		case
			WHEN [n] % 15 = 0 then 'FB'
			WHEN [n] % 3 = 0 then 'F'
			WHEN [n] % 5 = 0 then 'B'
			else cast(n as varchar(3))
		end
from nums
order by n;
18 май 17, 13:40    [20492829]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
vladislav109
Member

Откуда:
Сообщений: 69
DECLARE @i AS INT = 1;
WHILE @i <= 100
BEGIN
	IF @i % 3 = 0
		PRINT CONCAT(@i, ' - F')
	IF @i % 5 = 0
		PRINT CONCAT(@i, ' - B')
	IF @i % 3 = 0 and @i % 5 = 0
		PRINT CONCAT(@i, ' - FB')
	ELSE 
		PRINT @i
	SET @i = @i + 1;
END;
18 май 17, 16:09    [20493387]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
vladislav109
DECLARE @i AS INT = 1;
WHILE @i <= 100
BEGIN
	IF @i % 3 = 0
		PRINT CONCAT(@i, ' - F')
	IF @i % 5 = 0
		PRINT CONCAT(@i, ' - B')
	IF @i % 3 = 0 and @i % 5 = 0
		PRINT CONCAT(@i, ' - FB')
	ELSE 
		PRINT @i
	SET @i = @i + 1;
END;

садись 2.
18 май 17, 16:15    [20493406]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос!  [new]
rnk
Member

Откуда:
Сообщений: 126
Руслан Дамирович
Добрый день!
Необходимо вывести числа от 1 до 100 по следующему алгоритму:
если число кратно 3, то вывести 'F'
если число кратно 5, то вывести 'B'
если число кратно и 3 и 5, то вывести 'FB'
во всех остальных случаях вывести само число.
Помогите! Никак не соображу, что писать!

with nums as (
	select number as n
	from master..spt_values
	where type = 'p'
		and number between 1 and 100
)
select
	case n % 15 when 0 then 'FB'
		else case n % 5 when 0 then 'B'
			else case n % 3 when 0 then 'F'
				else convert(varchar(19),n)
			end
		end
	end	as n_str
from nums;
18 май 17, 17:31    [20493728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить