Hello,
I have a (big) table which is not normalized, but for i need at the
moment i think
that's no problem. Indeed, what i would like to do is to select the
name field and
the note. The problem is that i want to display the note in 2
different columns.
the first columns will show the number (count) of time that a certain
note (e.g note=4)
appears for a certain name and in the other column the same thing but
for a different note value.
so each column noteX will display the number of time that the note
with the value X appears for each name
for example, to the following table:
Name | note | job | city | id |
----------------------------------------
john | 4 | jb1 | hamb | 1 |
john | 5 | jb2 | hamb | 2 |
john | 5 | jb3 | hamb | 3 |
john | 5 | jb4 | hamb | 4 |
Mark | 4 | jb1 | mun | 5 |
Mark | 4 | jb2 | mun | 6 |
Mark | 4 | jb5 | mun | 7 |
Mark | 5 | jb1 | mun | 8 |
peter | 5 | jb3 | berl | 9 |
peter | 5 | jb5 | berl | 10 |
frank | 4 | jb6 | v.form | 11 |
frank | 5 | jb3 | v.form | 12 |
frank | 5 | jb2 | v.form | 13 |
the result should be:
Name | note5 | note4 |
-------------------------
john | 3 | 1 |
Mark | 1 | 3 |
peter | 2 | 0 |
frank | 2 | 1 |
How should be the right SQL command to show the data i want?
Rui Dias
rldias@gmail.com
Thanks a lot
Mark - 28 Feb 2008 10:56 GMT
select Name,
sum(case when note=5 then 1 else 0 end) as note5,
sum(case when note=4 then 1 else 0 end) as note4
from mytable
group by Name
rui dias - 28 Feb 2008 11:30 GMT
> select Name,
> sum(case when note=5 then 1 else 0 end) as note5,
> sum(case when note=4 then 1 else 0 end) as note4
> from mytable
> group by Name
Hello Mark,
Thanks a lot for your answer.
It is really nice!
I didn't know the command "case when filed=value then X else Y end"
Really nice! ;)
Dan Guzman - 28 Feb 2008 12:18 GMT
> I didn't know the command "case when filed=value then X else Y end"
Note that a SQL CASE is an expression rather than a command (as in some
other languages). You can use it where expressions are allowed in SQL.

Signature
Hope this helps.
Dan Guzman
SQL Server MVP
http://weblogs.sqlteam.com/dang/
>> select Name,
>> sum(case when note=5 then 1 else 0 end) as note5,
[quoted text clipped - 10 lines]
>
> Really nice! ;)
czytacz - 28 Feb 2008 11:25 GMT
not simple,
but possible is to use pivot/unpivot
Plamen Ratchev - 28 Feb 2008 13:18 GMT
Here is a version with the PIVOT operator in SQL Server 2005:
SELECT [name],
SUM([5]) AS note5,
SUM([4]) AS note4
FROM Foo
PIVOT (COUNT(note) FOR note IN ([5], [4])) AS P
GROUP BY [name];
HTH,
Plamen Ratchev
http://www.SQLStudio.com