2014-01-09 5 views
1

Учитывая приведенные ниже данные из двух табличных случаев и acct_transaction, как я могу включить только acct_transaction.create_date из наибольшей суммы acct_transaction, а также вычислить сумму всех сумм и значение от наибольшей суммы? Платформа - t-sql.Выберите столбец на основе max() другого столбца

id amount  create_date 
---|----------|------------| 
1 | 1.99  | 01/09/2009 | 
1 | 2.99  | 01/13/2009 | 
1 | 578.23 | 11/03/2007 | 
1 | 64.57 | 03/03/2008 | 
1 | 3.99  | 12/12/2012 | 
1 | 31337.00 | 04/18/2009 | 
1 | 123.45 | 05/12/2008 | 
1 | 987.65 | 10/10/2010 | 

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

id amount  create_date sum  max_amount max_amount_date 
---|----------|------------|----------|-----------|----------- 
1 | 1.99  | 01/09/2009 | 33099.87 | 31337.00 | 04/18/2009 
1 | 2.99  | 01/13/2009 | 33099.87 | 31337.00 | 04/18/2009 
1 | 578.23 | 11/03/2007 | 33099.87 | 31337.00 | 04/18/2009 
1 | 64.57 | 03/03/2008 | 33099.87 | 31337.00 | 04/18/2009 
1 | 3.99  | 12/12/2012 | 33099.87 | 31337.00 | 04/18/2009 
1 | 31337.00 | 04/18/2009 | 33099.87 | 31337.00 | 04/18/2009 
1 | 123.45 | 05/12/2008 | 33099.87 | 31337.00 | 04/18/2009 
1 | 987.65 | 10/10/2010 | 33099.87 | 31337.00 | 04/18/2009 

Это то, что я до сих пор, я просто не знаю, как вывести дату наибольшее количество acct_transaction для max_amount_date колонны. не

SELECT  cases.id, acct_transaction.amount, acct_transaction.create_date AS 'create_date', SUM(acct_transaction.amount) OVER() AS 'sum', MIN(acct_transaction.amount) OVER() AS 'max_amount' 
FROM  cases INNER JOIN 
      acct_transaction ON cases.id = acct_transaction.id 
WHERE  (cases.id = '1') 
+1

Какие RDBMS вы используете? – Bohemian

+0

t-sql на ms sql server 2008 r2 – phoeneous

ответ

0

Спасибо, что у меня на верном пути к этому, который работает:

,CAST((SELECT TOP 1 t2.create_date from acct_transaction t2 
      WHERE t2.case_sk = act.case_sk AND (t2.trans_type = 'F') 
      order by t2.amount, t2.create_date DESC) AS date) AS 'max_date' 

Это не позволит мне upvote, потому что у меня меньше, чем 15 респ :(

2

Вы можете просто полное внешнее соединение с таблицей, которая определяет агрегаты:

select id, amount, create_date, x.sum, x.max_amount, x.max_amount_date 
from table1 
full outer join 
(select sum(amount) as sum, max(amount) as max_amount, 
    (select top 1 create_date from table1 where amount = (select max(amount) from table1)) as max_amount_date 
from table1) x 
on 1 = 1 

SQL Fiddle demo

+0

Является ли таблица1 во вложенном элементе, предназначенном для чтения таблицы2? Существуют две таблицы, случаи и acct_transaction. – phoeneous

4
;WITH x AS 
(
    SELECT c.id, t.amount, t.create_date, 
    s = SUM(t.amount) OVER(), 
    m = MAX(t.amount) OVER(), 
    rn = ROW_NUMBER() OVER(ORDER BY t.amount DESC) 
    FROM dbo.cases AS c 
    INNER JOIN dbo.acct_transaction AS t 
    ON c.id = t.id 
) 
SELECT x.id, x.amount, x.create_date, 
    [sum] = y.s, 
    max_amount = y.m, 
    max_amount_date = y.create_date 
FROM x CROSS JOIN x AS y WHERE y.rn = 1; 
+0

Спасибо, даст этот снимок. – phoeneous

+0

Как обрабатывать с двумя таблицами, случаями и acct_transaction. Только столбец для случаев - id, rest - acct_transaction. – phoeneous

+0

@phoeneous вы что-нибудь пробовали? И почему на самом деле идентификатор case имеет то же значение, что и идентификатор транзакции? Это очень запутанно. –

1

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

Ниже приведена ссылка на объединение двух таблиц, которые вы упоминаете, но для которых вы не предоставляете схемы.

[SQL Fiddle][1] 

SELECT A.case_id 
,A.trans_id 
,A.trans_amount 
,A.trans_create_date 
,A.trans_type 
,B.max_amount 
,B.max_amount_date 
,E.sum_amount 
FROM acct_transaction AS A 
INNER JOIN (select C.case_id 
,MAX(C.trans_amount) AS max_amount 
,C.trans_create_date AS max_amount_date 
FROM acct_transaction AS C group by C.case_id, C.trans_create_date) AS B ON B.case_id = A.case_id 
inner JOIN (select D.case_id, SUM(D.trans_amount) AS sum_amount FROM acct_transaction AS D GROUP BY D.case_id) AS E on E.case_id = A.case_id 
WHERE (A.case_id = '1') AND (A.trans_type = 'F') 
GROUP BY A.case_id 
Смежные вопросы