2015-04-13 2 views
-1

Мне нужно создать отчет в следующем формате (первая строка с разделителями | содержит заголовки столбцов, общая сумма для всех учетных записей - это сумма Account.Value для данного AE и имена учетных записей и значения сгруппированы по каждому АЭ по имени учетной записи по возрастанию, по заказу AE первым именем по возрастанию):SQL select сгруппированные результаты

AE    | Account Value      | # of Calls 
Amy Adams   $5000 (total for all accounts) 
    *Acme Inc.  $1000        5 
    *Noon Inc.  $3000        7 
    *Tazo Inc.  $1000        2 
Ben Smith   $7000 (total for all accounts) 
    *Airo Inc.  $2000        9 
    *Fifa Inc.  $5000        8 
Dan Morse   $2000 (total for all accounts) 
    *Yakk Inc.  $1000        1 
    *Zero Inc.  $1000        2 

из следующих таблиц:

Table [AE] 
Column [AeId] int 
Column [FirstName] varchar 
Column [LastName] varchar 

Table [Account] 
Column [AccountId] int 
Column [Name] varchar 
Column [Value] decimal 
Column [AeId] int (foreign key AE.AeId) 

Table [Call] 
Column [CallId] int 
Column [DateCreated] datetime 
Column [AccountId] int (foreign key Account.AccountId) 

Любая помощь будет оценена, как и я m не уверен, как группировать данные таким образом. Спасибо за любые предложения.

+0

Это обширная тема. С какой из них вы столкнулись? Что вы попробовали и какую ошибку вы получили? –

+0

Было бы намного лучше, если бы вы предоставили образцы данных и желаемый результат, с красивым форматом структур ваших таблиц, теперь нетрудно дать вам ответ, но если учесть, что пункты, о которых я говорил, будут вам гораздо проще, лучше попробовать что-то перед запросом – jfun

ответ

0

Вы можете попробовать такие вещи, как WITH ROLLUP или CUBE С ...

Но я бы просто использовать КТР, как это:

create Table [AE] (
[AeId] int, 
[FirstName] varchar(50), 
[LastName] varchar(50) 
) 
create Table [Account] (
[AccountId] int, 
[Name] varchar(50), 
[Value] decimal, 
[AeId] int 
) 
create Table [Call] (
[CallId] int, 
[DateCreated] datetime, 
[AccountId] int 
) 
insert into ae values (1, 'Brett', 'Green') 
insert into ae values (2, 'John', 'Doe') 
insert into account values (1, 'Account 1', 10000, 1) 
insert into account values (2, 'Account 2', 5000, 1) 
insert into account values (3, 'Account 3', 3000, 1) 
insert into account values (4, 'Account 4', 1000, 2) 
insert into account values (5, 'Account 5', 5000, 2) 
insert into account values (6, 'Account 6', 3000, 2) 

insert into call values (1, current_timestamp, 1) 
insert into call values (2, current_timestamp, 1) 
insert into call values (3, current_timestamp, 2) 
insert into call values (4, current_timestamp, 3) 
insert into call values (5, current_timestamp, 4) 
insert into call values (6, current_timestamp, 5) 
insert into call values (7, current_timestamp, 5) 

;WITH data as (
SELECT 
    ae.FirstName + ' ' + ae.LastName AS Name, 
    a.Name AS AccountName, 
    SUM(a.Value) AS AccountValue, 
    COUNT(DISTINCT c.CallId) AS NumberOfCalls 
FROM AE ae 
INNER JOIN Account a 
    ON a.AeId = ae.AeId 
INNER JOIN Call c 
    ON c.AccountId = a.AccountId 
GROUP BY 
    ae.FirstName + ' ' + ae.LastName, 
    a.Name 
) 
select Name, '' AS AccountName, SUM(AccountValue) AS AccountValue, SUM(NumberOfCalls) AS NumberOfCalls 
from data 
group by Name 
union all 
select Name, AccountName, AccountValue, NumberOfCalls 
from data 
order By name 
+0

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

+0

SQL-сервер. Благодарю. –

+0

Пример SQL Server, приведенный выше –

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