DMStar
asked on
Progressive total
Dear Experts,
I Have a table with the following fields and data
ID NAME date Salary
1 Bob 2004-01-01 10
2 John 2004-01-01 10
3 Bob 2004-02-01 30
4 Helen 2004-02-01 20
5 Helen 2004-03-01 50
I want to see the following by single-query
Bob 2004-01-01 10
John 2004-01-01 10
Helen 2004-01-01 0
Bob 2004-02-01 40
John 2004-02-01 10
Helen 2004-02-01 20
Bob 2004-03-01 40
John 2004-03-01 10
Helen 2004-03-01 70
I Have a table with the following fields and data
ID NAME date Salary
1 Bob 2004-01-01 10
2 John 2004-01-01 10
3 Bob 2004-02-01 30
4 Helen 2004-02-01 20
5 Helen 2004-03-01 50
I want to see the following by single-query
Bob 2004-01-01 10
John 2004-01-01 10
Helen 2004-01-01 0
Bob 2004-02-01 40
John 2004-02-01 10
Helen 2004-02-01 20
Bob 2004-03-01 40
John 2004-03-01 10
Helen 2004-03-01 70
can you explain the expeted results a bit pls. I dont understand where the figures come from
sorry, forgot a join on id. Are the id's in your example correct, or maybe the join is supposed to be on name, not id.
Select m.NAME, m.date, sum(m1.Salary)
from MyTable m
LEFT OUTER JOIN MyTable m1 ON m1.date <= m.date AND m.id = m1.id
GROUP BY m.name, m.date
Select m.NAME, m.date, sum(m1.Salary)
from MyTable m
LEFT OUTER JOIN MyTable m1 ON m1.date <= m.date AND m.id = m1.id
GROUP BY m.name, m.date
For each date that appears in the Salaries table?
BTW, avoid using reserved words like "date" are column names.
Select Name, SDate, Sum(case S.Date <= D.Date then Salary else 0 end)
FROM Salaries S CROSS JOIN Select distinct [date] as SDate from Salaries) D
BTW, avoid using reserved words like "date" are column names.
Select Name, SDate, Sum(case S.Date <= D.Date then Salary else 0 end)
FROM Salaries S CROSS JOIN Select distinct [date] as SDate from Salaries) D
Select Name, SDate, Sum(case S.Date <= D.Date then Salary else 0 end)
FROM Salaries S CROSS JOIN Select distinct [date] as SDate from Salaries) D
GROUP BY Name, SDate
FROM Salaries S CROSS JOIN Select distinct [date] as SDate from Salaries) D
GROUP BY Name, SDate
Adwiseman's solution will miss out Helen's first record at least. Needs to be a cross product one the dates to ensure each date is represented for each Name.
Here with exactly your output
Select m.NAME, md.date, sum(ISNULL(m1.Salary, 0))
from (Select distinct name from MyTable) m
CROSS JOIN (Select distinct date from MyTable) md
LEFT OUTER JOIN MyTable m1 ON m1.date <= md.date AND m.name = m1.name
GROUP BY m.name, md.date
order by md.date, m.name
I'm selecting a list of names , and cross joining that with the distinct list of dates. Goving me a list of all names, with all dates. Then joining that in with the salart and grouping them. The order is not the same, but the result set is.
Select m.NAME, md.date, sum(ISNULL(m1.Salary, 0))
from (Select distinct name from MyTable) m
CROSS JOIN (Select distinct date from MyTable) md
LEFT OUTER JOIN MyTable m1 ON m1.date <= md.date AND m.name = m1.name
GROUP BY m.name, md.date
order by md.date, m.name
I'm selecting a list of names , and cross joining that with the distinct list of dates. Goving me a list of all names, with all dates. Then joining that in with the salart and grouping them. The order is not the same, but the result set is.
--my working code
create table MyTable([id] int, [name] varchar(50), [date] smalldatetime, salary int)
GO
insert into MyTable
Select 1, 'Bob', '2004-01-01', 10
insert into MyTable
Select 2, 'John', '2004-01-01', 10
insert into MyTable
Select 1, 'Bob', '2004-02-01', 30
insert into MyTable
Select 3, 'Helen', '2004-02-01', 20
insert into MyTable
Select 3, 'Helen', '2004-03-01', 50
GO
select * from MyTable
GO
Select m.NAME, md.date, sum(ISNULL(m1.Salary, 0))
from (Select distinct name from MyTable) m
CROSS JOIN (Select distinct date from MyTable) md
LEFT OUTER JOIN MyTable m1 ON m1.date <= md.date AND m.name = m1.name
GROUP BY m.name, md.date
order by md.date, m.name
create table MyTable([id] int, [name] varchar(50), [date] smalldatetime, salary int)
GO
insert into MyTable
Select 1, 'Bob', '2004-01-01', 10
insert into MyTable
Select 2, 'John', '2004-01-01', 10
insert into MyTable
Select 1, 'Bob', '2004-02-01', 30
insert into MyTable
Select 3, 'Helen', '2004-02-01', 20
insert into MyTable
Select 3, 'Helen', '2004-03-01', 50
GO
select * from MyTable
GO
Select m.NAME, md.date, sum(ISNULL(m1.Salary, 0))
from (Select distinct name from MyTable) m
CROSS JOIN (Select distinct date from MyTable) md
LEFT OUTER JOIN MyTable m1 ON m1.date <= md.date AND m.name = m1.name
GROUP BY m.name, md.date
order by md.date, m.name
I would sugest using a different source for the list of all distinct dates. A function that returns a table given a start and end date, or create a table of all dates say between 01-01-1900 and 01-01-2200
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
2 adwiseman
Your code works fine
2monosodiumg
doesn't work syntax error
Thanks everybody
Your code works fine
2monosodiumg
doesn't work syntax error
Thanks everybody
Select m.NAME, m.date, sum(m1.Salary)
from MyTable m
LEFT OUTER JOIN MyTable m1 ON m1.date <= m.date
GROUP BY m.name, m.date