Рабочее общее количество сгруппированными записями в таблице

Самым простым вариантом было бы поменять оператор выбора на что-то вроде этого, где вы задаете уникальные имена для полей с одинаковым именем:

Select Table1.Key1 as [Key1a], Table2.Key1 as [Key1b], etc.
INTO NewTable  
FROM Table1  
LEFT JOIN Table2  
ON    
    Table1.Key1 = Table2.Key1 
AND Table1.Key2 = Table2.Key2

Если вы используете SSMS, вы можете выделите ваш запрос, щелкните правой кнопкой мыши по нему и выберите «Дизайн в редакторе запросов», и он покажет вам оператор выбора как «выбрать [все поля]», а не «выбрать *», что, вероятно, будет вам полезно.

10
задан Zsolt Botykai 13 January 2009 в 14:34
поделиться

3 ответа

Вам действительно нужна дополнительная таблица?

Можно получить те данные, в которых Вы нуждаетесь с простым запросом, который можно, очевидно, создать как представление, если Вы хотите, чтобы они появились как таблица.

Это получит Вас данные, которые Вы ищете:

select 
    account, bookdate, amount, 
    sum(amount) over (partition by account order by bookdate) running_total
from t
/

Это создаст представление, чтобы показать Вам данные, как будто это была таблица:

create or replace view t2
as
select 
    account, bookdate, amount, 
    sum(amount) over (partition by account order by bookdate) running_total 
from t
/

При реальной необходимости в таблице Вы подразумеваете необходимость в ней постоянно обновляемый? или просто тот прочь? Очевидно, если это - то от Вас, может просто "составить таблицу как избранное" использование вышеупомянутого запроса.

Данные тестирования, которые я использовал:

create table t(account number, bookdate date, amount number);

insert into t(account, bookdate, amount) values (1, to_date('20080101', 'yyyymmdd'), 100);

insert into t(account, bookdate, amount) values (1, to_date('20080102', 'yyyymmdd'), 101);

insert into t(account, bookdate, amount) values (1, to_date('20080103', 'yyyymmdd'), -200);

insert into t(account, bookdate, amount) values (2, to_date('20080102', 'yyyymmdd'), 200);

commit;

править:

забыл добавлять; Вы указали, что хотели, чтобы таблица была заказана - это действительно не имеет смысла и заставляет меня думать, что Вы действительно подразумеваете желание запроса/представления - упорядочивание является результатом запроса, который Вы выполняете, не что-то, что это свойственно от таблицы (игнорирующий Индекс Организованные Таблицы и т.п.).

15
ответ дан 3 December 2019 в 18:02
поделиться

Я запущу с этого очень важного caveate: НЕ составляйте таблицу для содержания этих данных. Когда Вы сделаете Вы найдете, что необходимо поддержать его, который станет никогда конечной головной болью. Запишите представление для возврата дополнительного столбца, если Вы хотите сделать это. Если бы Вы работаете с хранилищем данных затем, возможно, Вы сделали бы что-то вроде этого, но даже затем допустили бы ошибку на стороне представления, если Вы просто не можете получить производительность, в которой Вы нуждаетесь с индексами, достойными аппаратными средствами, и т.д.

Вот запрос, который возвратит строки способ, которым Вам нужны они.

SELECT
    Account,
    Bookdate,
    Amount,
    (
        SELECT SUM(Amount)
        FROM My_Table T2
        WHERE T2.Account = T1.Account
          AND T2.Bookdate <= T1.Bookdate
    ) AS Running_Total
FROM
    My_Table T1

Другое возможное решение:

SELECT
    T1.Account,
    T1.Bookdate,
    T1.Amount,
    SUM(T2.Amount)
FROM
    My_Table T1
LEFT OUTER JOIN My_Table T2 ON
    T2.Account = T1.Account AND
    T2.Bookdate <= T1.Bookdate
GROUP BY
    T1.Account,
    T1.Bookdate,
    T1.Amount

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

4
ответ дан 3 December 2019 в 18:02
поделиться

Используйте аналитику, точно так же, как в Вашем последнем вопросе:

create table accounts
( account number(10)
, bookdate date 
, amount   number(10)
);

delete accounts;

insert into accounts values (1,to_date('20080101','yyyymmdd'),100);
insert into accounts values (1,to_date('20080102','yyyymmdd'),101);
insert into accounts values (2,to_date('20080102','yyyymmdd'),200);
insert into accounts values (1,to_date('20080103','yyyymmdd'),-200);

commit;

select account
,      bookdate 
,      amount
,      sum(amount) over (partition by account order by bookdate asc) running_total
from accounts
order by account,bookdate asc
/

вывод:

   ACCOUNT BOOKDATE     AMOUNT RUNNING_TOTAL
---------- -------- ---------- -------------
         1 01-01-08        100           100
         1 02-01-08        101           201
         1 03-01-08       -200             1
         2 02-01-08        200           200
3
ответ дан 3 December 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: