2013-11-29 5 views
2

У меня вопрос о получении данных в виде таблицы. У меня есть таблица с одной строки Теперь я просто хочу, сумма увеличилась на основе по данной логике .. какУвеличенное количество каждой строки в sql

1st row amount=1200, 
2nd row amount=1320(1200+120), 
3rd row amount=1452(1320+132) 

логика 10% добавить с предыдущим количеством

Моя таблица

Sno - Name- Amount 
1 - A - 1200 

Теперь я хочу привести, как это ..

Sno - Name- Amount 

1 - A - 1200 
2 - A - 1320 
3 - A - 1452 

Может кто-нибудь помочь мне я не найти никакой логики для этого

+0

Что RDBMS вы с помощью SQL-сервера или MySQL? Конечно, это не может быть как '-) – Mureinik

+0

Я использую sql server @Mureinik – user3016777

+0

Что вы пытаетесь достичь? Добавление демо-данных? Поскольку заполнение данных, как это, вероятно, более эффективно в программе. –

ответ

4

Это имеет точно такое же ограничение, как ответ WadimX, но он будет делать 100 строк. Для того, чтобы произвести ваш пример выводу дал свою входную таблицу (который я буду называть example):

;WITH nums AS 
    (SELECT 1 AS RowNum, Name, Amount 
    FROM (SELECT Name, Amount FROM example) s 
    UNION ALL 
    SELECT RowNum + 1 As RowNum, Name, CAST(1.1*Amount AS INT) AS Amount 
    FROM nums 
    WHERE RowNum < 5) 
SELECT RowNum AS SNo, Name, Amount 
FROM nums 
ORDER BY Name 

SQLFiddle

Это возвращает 5 строк для каждой записи в example, вы можете увеличить это количество путем изменения RowNum < 5 до 100 или как угодно много вы хотите.

Выход

SNo Name  Amount 
----------------------- 
1  A  1200 
2  A  1320 
3  A  1452 
... ...  ... 
+0

Что такое 1.1 здесь? И как он будет вычислять значение? –

+0

Логика OP состоит в том, что каждое значение является предыдущим значением + 10%. Значение начинается с 1200, а затем как само по себе + 10% во время рекурсия. – OGHaza

+0

Мне удалось немного набить код во время редактирования там, но его работа обратно;) – OGHaza

0

Это делает то, что вы просите:

select sno, name, amount from table1 
union select sno+1, name, amount*1.1 from table1 
union select sno+2, name, amount*1.1*1.1 from table1 

Но это не очень гибким. Например. если есть несколько строк, вы можете получить повторяющиеся номера «sno».

1
WITH COUNTER(RN) 
    AS 
    (
     SELECT ROW_NUMBER() OVER(ORDER BY object_id) 
     FROM sys.objects 
    ), 
    A(RN, value) 
    AS 
    (
     SELECT CAST(1 as bigint), 
       CAST(1200 as decimal(20, 0)) 
     UNION ALL 
     SELECT COUNTER.RN, 
       CAST(A.value*1.1 as decimal(20, 0)) 
     FROM COUNTER JOIN A ON A.RN=COUNTER.RN-1 
    ) 
SELECT TOP 1000 * 
FROM A 
OPTION(MAXRECURSION 1000) 

В этом примере выбираются первые 1000 строк из объектов sys.object. Вы должны заменить sys.objects с именем вашей таблицы и object_id с основными/уникальными ключевыми колонками. Также вам следует изменить TOP 1000 и MAXRECURSION 1000. Уведомление MAXRECURSION может быть от 0 до 32767, 0 - без ограничений. Знайте о больших таблицах, поскольку это может вызвать арифметическое переполнение значения.

+1

CTE разбивается на 100 уровень рекурсии, у вас не может быть 1000 строк с этим.Измените sys.objects с master..spt_values ​​и object_id с именем для проверки. BTW приятно попробовать :) – ARA

+0

Вы правы. :( – WadimX

0

Remodified ответ использовать CTE вместо:

DECLARE @T TABLE (sno INT, name CHAR(1), amount INT) 
INSERT INTO @T 
SELECT 1, 'a', 1200 

;WITH cte AS (
    SELECT sno, name, amount 
    FROM @T 
    WHERE sno = 1 
    UNION ALL 
    SELECT sno+1, name, amount + amount/10 
    FROM cte 
    WHERE sno+1 <= 100 
) 
SELECT * 
FROM cte 

Результаты:

sno name amount 
1 a 1200 
2 a 1320 
3 a 1452 
4 a 1597 
5 a 1756 
6 a 1931 
Смежные вопросы