2015-10-23 12 views
1
rN   rD   rnc  d  expectedResult 
abc1m  2010-03-31 abc  5.7 5.7 + 1.7 +9.6 
abc3m  2010-03-31 abc  5.7 5.7 + 1.7 +9.6 
abc1y  2010-03-31 abc  5.7 5.7 + 1.7 +9.6 
xfx1m  2010-03-31 xfx  1.7 5.7 + 1.7 +9.6 
xfx3m  2010-03-31 xfx  1.7 5.7 + 1.7 +9.6 
xfx1y  2010-03-31 xfx  1.7 5.7 + 1.7 +9.6 
tnt1m  2010-03-31 tnt  9.6 5.7 + 1.7 +9.6 
tnt3m  2010-03-31 tnt  9.6 5.7 + 1.7 +9.6 
tnt1y  2010-03-31 tnt  9.6 5.7 + 1.7 +9.6 
------------------------------------ 
abc1m  2010-04-01 abc  2.2 2.2 + 8.9 + 5.5 
abc3m  2010-04-01 abc  2.2 2.2 + 8.9 + 5.5 
abc1y  2010-04-01 abc  2.2 2.2 + 8.9 + 5.5 
xfx1m  2010-04-01 xfx  8.9 2.2 + 8.9 + 5.5 
xfx3m  2010-04-01 xfx  8.9 2.2 + 8.9 + 5.5 
xfx1y  2010-04-01 xfx  8.9 2.2 + 8.9 + 5.5 
tnt1m  2010-04-01 tnt  5.5 2.2 + 8.9 + 5.5 
tnt3m  2010-04-01 tnt  5.5 2.2 + 8.9 + 5.5 
tnt1y  2010-04-01 tnt  5.5 2.2 + 8.9 + 5.5 

ожидаемый результат является суммой отчетливым СРН на определенную дату Как этого добиться. Я хотел бы использовать что-то вроде кода ниже, но не работает.SQL SERVER - сумма по перегородке отчетливым

select *, 
sum (d) over (partition by rD, distinct rnc) as expectedResult 
from myTable 
where ...--some condition 
order by ...--order by some columns 

Использование SQL Server 2012, благодаря

редактировать: Что касается вопроса, находящейся на удержании, как это неясно. ЕСЛИ один смотрит только на столбец expectedResult, разве это не ясно? Что я должен добавить, чтобы сделать его лучше? - И каждый rnc имеет d. Предположим, что каждый набор имеет форму, приведенную в примере. (ответ на один комментарий)

+0

Глядя на ваши данные, последние 2 символа из колонки Р.Н. можно использовать для группировки по ... являются ли эти символы всегда повторяемыми (1m, 3m, 1y) во всех RNC или это совпадение? – Veljko89

+0

всегда повторяется. и столбец rnc просто триммы rN – CM2K

+0

Ну, в этом случае вы можете просто выбрать Select Right (rN, 3), SUM (d) из группы myTable по праву (rN, 3), и вы получите то, что хотите – Veljko89

ответ

1

В последние 2 символа для первого столбца повторяется, и вы на самом деле суммирования в разделе с тем, что, дайте ему идти, и дайте мне знать, если это то, что вы просили

create table #TempTable (rn nvarchar(10), rD date, rnc nvarchar(10), d decimal(5,2)) 

insert into #TempTable (rn, rD, rnc, d) 
values 
('abc1m','2010-03-31','abc',  5.7), 
('abc3m','2010-03-31','abc',  5.7), 
('abc1y','2010-03-31','abc',  5.7), 
('xfx1m','2010-03-31','xfx',  1.7), 
('xfx3m','2010-03-31','xfx',  1.7), 
('xfx1y','2010-03-31','xfx',  1.7), 
('tnt1m','2010-03-31','tnt',  9.6), 
('tnt3m','2010-03-31','tnt',  9.6), 
('tnt1y','2010-03-31','tnt',  9.6), 
------------------------------------ 
('abc1m','2010-04-01','abc',  2.2), 
('abc3m','2010-04-01','abc',  2.2), 
('abc1y','2010-04-01','abc',  2.2), 
('xfx1m','2010-04-01','xfx',  8.9), 
('xfx3m','2010-04-01','xfx',  8.9), 
('xfx1y','2010-04-01','xfx',  8.9), 
('tnt1m','2010-04-01','tnt',  5.5), 
('tnt3m','2010-04-01','tnt',  5.5), 
('tnt1y','2010-04-01','tnt',  5.5) 

select rn, rD, rnc, d, SUM(d) over (partition by right(rn,2), rD) as 'Sum' 
from #TempTable 
order by Rd 
+0

Могу ли я избежать групповой работы? Потому что я дал это в качестве примера, но на самом деле у меня есть 20 столбцов, и тогда я должен упомянуть их все в группе select +. Спасибо за ответ кстати. Также почему вы правы (rN, 2), когда у вас уже есть это в rnc. – CM2K

+0

Когда вы выполняете какую-либо агрегированную функцию, вы должны иметь группу – Veljko89

+2

, если я не использую оконные функции, как в 'over (partition -by) ' – CM2K

1

Здесь мы используем cte для группировки строк, которые являются одинаковыми вместе. Таким образом, мы можем суммировать только первую строку каждой группы в select.

;WITH cte 
AS 
(
    SELECT *, 
      GroupRowIndex = ROW_NUMBER() OVER (PARTITION BY rateDate, rnc, d ORDER BY (SELECT 1)) 
    FROM myTable 
) 

SELECT *, 
     expectedResult = SUM(d) OVER (PARTITION BY rateDate) 
FROM cte 
WHERE GroupRowIndex = 1 
AND ...--some condition 
ORDER BY ...--order by some columns 
+0

Пробовал, но не работает, как мне хотелось. Похоже, он вычисляет так: '5.7 + 5.7 + 5.7' как« Ожидаемый результат », затем« 1.7 + 1.7 + 1.7'. Он должен принимать отличное значение rnc (так как они одинаковы для той же даты) – CM2K

+0

см. 'ExpectedResult' – CM2K

+0

@ CM2k, я отредактировал свой ответ – AXMIM

0

легко, если вы не хотите быть фантазиями

  • сначала вам нужна таблица отчетливой Р.Д., RND и d значение
  • , то вам нужно суммировать эти значения
  • Затем присоедините их к исходному столу

.

select rN, rD, rnc, d, sub.dsum as expectedResult 
from yourtable 
join (
    select rD, rnd, sum(d) as dsum 
    from (select distinct rD, rnd, d 
     from yourtable 
) x 
    group by rD, rnd 
) sub on yourtable.rD = sub.rD and yourtable.rnd = sub.rnd 
1

Вы можете использовать крест Применить, чтобы применить сумму различных RNC значений на основе РД

SELECT t1.*, ca.expectedResult 
FROM myTable t1 
CROSS APPLY (
    SELECT SUM(d) expectedResult 
    FROM (SELECT DISTINCT rnc, d 
      FROM myTable t2 
      WHERE t2.rd = t1.rd) AS s) ca 

SQL Fiddle

+0

не рассмотрел «крест-накладку», спасибо, вы дали мне хорошее представление о будущем, как я мог бы это использовать. Я пошел с другим решением, потому что это было самый простой способ достижения ожидаемого результата – CM2K

Смежные вопросы