Запрос на суммирование до определенных строк в таблице - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть запрос, подобный:

select
    CONVERT(VARCHAR(7),[startdatetime],111) AS [year-month],
    nm.nameLine1,
    sum(datediff(hour, startdatetime, enddatetime)) as total 
from  srl
inner join  sr on srl= sr.ServiceRequestId
inner join Name nm on(sr.clientCustomerId = nm.customerId and nm.nameTypeId = 'OFICE')
where (startdatetime >= '08-01-2011 00:00:00.000' and enddatetime <= '10-31-2011 00:00:00.000')
group by nm.nameLine1, [year-month]
order by nm.nameLine1, [year-month]

Вывод вышеуказанного запроса: ::

year-month nameLine1       total       
---------- ---------       ----------- 
2011/08    B               4 
2011/09    B               7 
2011/10    B               0 
2011/08    E               167 
2011/09    E               212 
2011/10    E               131 
2011/08    L               14 
2011/09    L               23 
2011/10    L               3 
2011/08    O               18 
2011/09    O               8 
2011/10    O               7 
2011/08    S               43 
2011/09    S               60 
2011/10    S               60 

Теперь мой вопрос: что мне делать в запросе, чтобы получитьсуммирование в другом столбце с именем nameLine1total для одного nameLine1.Вывод должен быть таким:

year-month nameLine1       total            nameLine1total
---------- ---------       -----------      ---------------
2011/08    B               4         
2011/09    B               7                 
2011/10    B               0                    11 
2011/08    E               167 
2011/09    E               212 
2011/10    E               131                  510 
2011/08    L               14 
2011/09    L               23 
2011/10    L               3                    40 
2011/08    O               18 
2011/09    O               8 
2011/10    O               7                    33
2011/08    S               43 
2011/09    S               60 
2011/10    S               60                   163

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Из-за convert(.., .., 111) Я предполагаю, что это SQL-сервер, если это 2005+, я бы использовал CTE:

with cte (ym, n, total, row) as (
    select *, row_number() over(partition by nameLine1 order by nameLine1, [year-month])  from (
        select
            convert(varchar(7),[startdatetime],111) as [year-month],
            nm.nameLine1,
            sum(datediff(hour, startdatetime, enddatetime)) as total 
        from  srl
        inner join sr on srl= sr.ServiceRequestId
        inner join Name nm on 
            sr.clientCustomerId = nm.customerId and 
            nm.nameTypeId = 'OFICE'
        where startdatetime >= '08-01-2011 00:00:00.000' and enddatetime <= '10-31-2011 00:00:00.000'
        group by nm.nameLine1, [year-month]
        order by nm.nameLine1, [year-month]
    ) t
) 
select c.ym as [year-month], c.n as [nameLine1], c.total as [total], g.total as [nameLine1total]
from cte c
left join (
    select max(row) as row, sum(total) as total, n 
    from cte group by n
) g on c.n = g.n and c.row = g.row
0 голосов
/ 12 декабря 2011

Какое разнообразие sql вы используете - sql server, mysql и т. Д. Кроме того, ваш ответ не имеет значения, но вы действительно хотите <= 10-31-2011 00:00:00, чтобы данные из31 октября не входит в ваш запрос?Кроме того, как вы собираетесь использовать этот запрос - если он предназначен для инструмента отчетности, вполне вероятно, что инструмент отчетности может вычислить его легче, чем SQL.Если было бы приемлемо включить общее количество именных строк в каждую строку, это было бы проще - например, если бы все три строки для "S" сказали "163" в последнем столбце, это нормально? </p>

...