SELECT dbo.MyTable.User, dbo.MyTable.Stage, dbo.MyTable.Date, SUM(dbo.MyTable.Amount) AS Amount, COUNT(DISTINCT dbo.MyTable.Id) AS Total
FROM dbo.MyTable
GROUP BY dbo.MyTable.User, dbo.MyTable.Stage, dbo.MyTable.Date
;with cte as (select distinct stage from mytable group by stage)
select a.user,cte.stage,sum(a.amount0 as Amount,count(distinct a.id) as Count, a.date from mytable a outer join cte on cte.stage=a.stage
| user | date | amount | stage |
|------|------------|--------|--------|
| MARK | 17/03/2015 | 60 | Step 1 |
| MARK | 17/03/2015 | 0 | Step 2 |
| MARK | 17/03/2015 | 40 | Step 3 |
| MARK | 17/03/2015 | 0 | Step 4 |
| MARK | 24/03/2015 | 0 | Step 4 |
| MARK | 24/03/2015 | 5 | Step 3 |
| MARK | 24/03/2015 | 10 | Step 2 |
| MARK | 24/03/2015 | 25 | Step 1 |
| MARK | 31/03/2015 | 10 | Step 1 |
| MARK | 31/03/2015 | 5 | Step 2 |
| MARK | 31/03/2015 | 0 | Step 3 |
| MARK | 31/03/2015 | 2 | Step 4 |
| JOHN | 24/03/2015 | 10 | Step 1 |
| JOHN | 24/03/2015 | 0 | Step 4 |
| JOHN | 24/03/2015 | 0 | Step 3 |
| JOHN | 24/03/2015 | 0 | Step 2 |
| JOHN | 31/03/2015 | 7 | Step 2 |
| JOHN | 31/03/2015 | 3 | Step 2 |
| JOHN | 31/03/2015 | 1 | Step 3 |
| JOHN | 31/03/2015 | 0 | Step 4 |
| JOHN | 31/03/2015 | 9 | Step 1 |
select t.[user], t.date, coalesce(m.amount,0) as amount, t.stage
from (select *
from (select distinct [user], date from mytable) ud
cross join (select distinct stage from mytable) s
) t
left join mytable m on t.[user] = m.[user] and t.date = m.date and t.stage = m.stage
order by [user] DESC, date
;
CREATE TABLE MyTable
([ID] int, [USER] varchar(4), [STAGE] varchar(6), [AMOUNT] int, [DATE] varchar(10))
;
INSERT INTO MyTable
([ID], [USER], [STAGE], [AMOUNT], [DATE])
VALUES
(123, 'MARK', 'Step 1', 60, '17/03/2015'),
(124, 'MARK', 'Step 3', 40, '17/03/2015'),
(125, 'MARK', 'Step 1', 25, '24/03/2015'),
(126, 'MARK', 'Step 2', 10, '24/03/2015'),
(127, 'MARK', 'Step 3', 5, '24/03/2015'),
(128, 'MARK', 'Step 2', 5, '31/03/2015'),
(129, 'MARK', 'Step 1', 10, '31/03/2015'),
(130, 'MARK', 'Step 4', 2, '31/03/2015'),
(131, 'JOHN', 'Step 1', 10, '24/03/2015'),
(132, 'JOHN', 'Step 1', 9, '31/03/2015'),
(133, 'JOHN', 'Step 2', 7, '31/03/2015'),
(134, 'JOHN', 'Step 2', 3, '31/03/2015'),
(135, 'JOHN', 'Step 3', 1, '31/03/2015')
;
**Query 1**:
select t.[user], t.date, coalesce(m.amount,0) as amount, t.stage
from (select *
from (select distinct [user], date from mytable) ud
cross join (select distinct stage from mytable) s
) t
left join mytable m on t.[user] = m.[user] and t.date = m.date and t.stage = m.stage
order by [user] DESC, date
**[Results][2]**:
| user | date | amount | stage |
|------|------------|--------|--------|
| MARK | 17/03/2015 | 60 | Step 1 |
| MARK | 17/03/2015 | 0 | Step 2 |
| MARK | 17/03/2015 | 40 | Step 3 |
| MARK | 17/03/2015 | 0 | Step 4 |
| MARK | 24/03/2015 | 0 | Step 4 |
| MARK | 24/03/2015 | 5 | Step 3 |
| MARK | 24/03/2015 | 10 | Step 2 |
| MARK | 24/03/2015 | 25 | Step 1 |
| MARK | 31/03/2015 | 10 | Step 1 |
| MARK | 31/03/2015 | 5 | Step 2 |
| MARK | 31/03/2015 | 0 | Step 3 |
| MARK | 31/03/2015 | 2 | Step 4 |
| JOHN | 24/03/2015 | 10 | Step 1 |
| JOHN | 24/03/2015 | 0 | Step 4 |
| JOHN | 24/03/2015 | 0 | Step 3 |
| JOHN | 24/03/2015 | 0 | Step 2 |
| JOHN | 31/03/2015 | 7 | Step 2 |
| JOHN | 31/03/2015 | 3 | Step 2 |
| JOHN | 31/03/2015 | 1 | Step 3 |
| JOHN | 31/03/2015 | 0 | Step 4 |
| JOHN | 31/03/2015 | 9 | Step 1 |
[1]: http://sqlfiddle.com/#!6/33474/7
[2]: http://sqlfiddle.com/#!6/33474/7/0