Been working on this SQL dilemma for a while now. The part of the table looks like the following. 
It's a many-to-many table relationship where one claim can have many notes. So, one example would be the following:
------------------------------------------
| ClaimID | NoteID | Note |
------------------------------------------
| 2387 | 1 | Test 1 |
| 2387 | 2 | Test 2 |
| 2387 | 3 | Test 3 |
| 2532 | 4 | Something 1 |
| 2539 | 5 | abcd |
| 2539 | 6 | jklm |
------------------------------------------
You get the idea.
So, when I run the query I want the result in such a way that it should show me the number of note counts from 1 to 10. If the count exist, then it should show me the count, otherwise 0. An example of what it would look like in the real-world scenario is the following.
[{
"numOfNotes":1,
"count":5916
},{
"numOfNotes":2,
"count":1846
},{
"numOfNotes":3,
"count":639
},{
"numOfNotes":4,
"count":226
},{
"numOfNotes":5,
"count":94
},{
"numOfNotes":6,
"count":50
},{
"numOfNotes":7,
"count":10
},{
"numOfNotes":8,
"count":2
},{
"numOfNotes":9,
"count":2
},{
"numOfNotes":11,
"count":2
}]
That's the query return from the database that I retrieved using C# and linq. Here's the code for that.
if (type == "e" || type == "p")
{
//sub query to retrieve notes
var subquery = from f in db.DBFileInfo
join c in db.Claims on f.FileID equals c.FileID into cl
from gp1 in cl.DefaultIfEmpty()
join n in db.Notes on gp1.ClaimID equals n.ClaimID into nt
from gp2 in nt.DefaultIfEmpty()
where f.ReportDate.Month == month && f.ReportDate.Year == year
group gp2 by gp2.ClaimID into g
select new
{
Key = g.Key,
Count = g.Count()
};
//query to grop by notes count. Notes count is consider contact per claim
var count = (from c in db.Claims
join s in subquery on c.ClaimID equals s.Key
where c.RecordType == type &&
(c.Username != "RxService")
&& (c.HIC3 != "J3A" && c.HIC3 != "J3C" && c.HIC3 != "H7N")
group s by s.Count into g
orderby g.Key
select new
{
NumOfNotes = g.Key,
count = g.Count()
}).Take(10);
}
If you notice in the result, there are numOfNotes from 1 - 11 but 10 is missing. That's because there aren't any claimID that has 10 notes. So, in this case, I still want SQL to return "numOfNotes": 10, "count": 0. And if you notice, I only asked for 10 results (Take(10)), because there can be more than 10 such notes per claim which we are not interested.
And in some cases, there aren't more than 5 notes per claimID for the given time period. In one instance, the result from SQL only goes up to 6. But I still want the result upto 10 whether it exists or not. Is it possible?
In case if you're interested: Here's my SQL statement
SELECT
count(C.ClaimID) as count, N.NotesPerClaim
FROM
ClaimsTable C
INNER JOIN
(SELECT
claimid, count(note) as NotesPerClaim
FROM
NotesTable
GROUP BY
ClaimID) as N ON N.ClaimID = C.ClaimID
WHERE
RecordType = 'e' AND
(Username <> 'RxService') AND
(HIC3 <> 'J3A' AND HIC3 <> 'J3C' AND HIC3 <> 'H7N')
GROUP BY
N.NotesPerClaim
ORDER BY
N.NotesPerClaim;