SQL Running Sum с флагами на определенное количество - PullRequest
1 голос
/ 10 августа 2009

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

У меня есть удостоверение личности, размер подарка и дата подарка. например:

ID           gift_date       gift_amt
---------    -----------     --------------  
1            1/6/09          500
2            1/9/09          200
2            1/15/09         65
3            1/26/09         140
2            2/10/09         600
3            3/7/09          200

Я бы хотел, чтобы в моем запросе отображался флаг для идентификатора № 1 в строке с датой_дня 01.01.09, для идентификатора № 2 для даты подарка 2/10/09 и без флага для идентификатора № 3.

Ответы [ 4 ]

1 голос
/ 10 августа 2009

В Oracle и PostgreSQL 8.4:

SELECT  q.*, CASE WHEN psum > 500 THEN 1 ELSE 0 END AS flag
FROM    (
        SELECT  gd.*, SUM(gift_amt) OVER (PARTITION BY id ORDER BY gift_date) AS psum
        FROM    gift_date gd
        ) q
WHERE   psum <= 500 - gift_amt
1 голос
/ 10 августа 2009

Обычно это делается представлением (как в Model-View-Controller ). Чаще всего это будет элемент управления сеткой, который имеет функции группировки, а не когда данные загружаются. Затем вы загружаете данные из базы данных, как показано выше, и настраиваете представление для отображения сгруппированных данных.

0 голосов
/ 06 июля 2011

Для SQL Server версии 2005+ используйте запрос ниже, если вам нужен только столбец с флажком

--suppose this is your table
DECLARE @Table TABLE 
(
    ID int,gift_date datetime,gift_amt int
)
INSERT INTO @Table
SELECT 1,'1/6/09',500 UNION ALL
SELECT 2,'1/9/09',200 UNION ALL
SELECT 2,'1/15/09',65 UNION ALL
SELECT 3,'1/26/09',140 UNION ALL
SELECT 2,'2/10/09',600 UNION ALL
SELECT 3,'3/7/09',200

;WITH CTE As 
(
    SELECT ID,gift_date,gift_amt,
    SUM(gift_amt)OVER(PARTITION BY ID) As TotalSum
    FROM @Table
)
SELECT ID,gift_date,gift_amt,
CASE WHEN TotalSum>500 then 1 else 0 end as Flag
FROM CTE
0 голосов
/ 10 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...