Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase

Need Result By using pivot or CTE Expand / Collapse
Author
Message
Posted Tuesday, January 08, 2013 8:47 AM
Grasshopper

GrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopper

Group: General Forum Members
Last Login: Sunday, May 12, 2013 9:57 PM
Points: 14, Visits: 94
Hi all,
I have a data like as shown below in my table.

ID Name Mode
-----------------------------
1 AAAAAAA Phone
2 AAAAAAA Phone
3 AAAAAAA Phone
4 BBBBB SMS
5 BBBBB SMS
6 CCCCC Email
7 AAAAAAA SMS

Need output as shown below.

O/P
----
Name Phone SMS email
----------------------------
AAAAAAA 3 1 0
BBBBB 0 2 0
CCCCC 0 0 1

Thank's in advance

Post #1404292
Posted Tuesday, January 08, 2013 8:56 AM


UDP Broadcaster

UDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP Broadcaster

Group: General Forum Members
Last Login: 2 days ago @ 2:28 PM
Points: 1,498, Visits: 18,142
DECLARE @t TABLE(ID INT, Name VARCHAR(10), Mode VARCHAR(10))
INSERT INTO @t(ID,Name,Mode)
VALUES(1, 'AAAAAAA','Phone'),
(2, 'AAAAAAA','Phone'),
(3, 'AAAAAAA','Phone'),
(4, 'BBBBB','SMS'),
(5, 'BBBBB','SMS'),
(6, 'CCCCC','Email'),
(7, 'AAAAAAA','SMS');

SELECT Name,
SUM(CASE WHEN Mode='Phone' THEN 1 ELSE 0 END) AS Phone,
SUM(CASE WHEN Mode='SMS' THEN 1 ELSE 0 END) AS SMS,
SUM(CASE WHEN Mode='Email' THEN 1 ELSE 0 END) AS Email
FROM @t
GROUP BY Name
ORDER BY Name;



____________________________________________________

How to get the best help on a forum

http://www.sqlservercentral.com/articles/Best+Practices/61537

Never approach a goat from the front, a horse from the rear, or a fool from any direction.
Post #1404299
Posted Tuesday, January 08, 2013 9:09 AM
Grasshopper

GrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopperGrasshopper

Group: General Forum Members
Last Login: Sunday, May 12, 2013 9:57 PM
Points: 14, Visits: 94
Thankq for your response. I need Mode column values as column name.
Post #1404311
Posted Tuesday, January 08, 2013 9:15 AM


UDP Broadcaster

UDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP BroadcasterUDP Broadcaster

Group: General Forum Members
Last Login: 2 days ago @ 2:28 PM
Points: 1,498, Visits: 18,142
Have a look here

____________________________________________________

How to get the best help on a forum

http://www.sqlservercentral.com/articles/Best+Practices/61537

Never approach a goat from the front, a horse from the rear, or a fool from any direction.
Post #1404318
Posted Tuesday, January 08, 2013 5:58 PM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: 2 days ago @ 12:42 AM
Points: 2,338, Visits: 3,158
venkatesh.b 88975 (1/8/2013)
Thankq for your response. I need Mode column values as column name.


If you mean you have more than 3 modes and don't know how many you would need to convert Mark's solution to dynamic SQL that generates the dynamic column result.



No loops! No CURSORs! No RBAR! Hoo-uh!

INDEXing a poor-performing query is like putting sugar on cat food. Yeah, it probably tastes better but are you sure you want to eat it?

Need to UNPIVOT? Why not CROSS APPLY VALUES instead?
Since random numbers are too important to be left to chance, let's generate some!
Are you too recursively challenged?
Splitting strings based on patterns can be fast!
Post #1404510
Posted Wednesday, January 09, 2013 12:47 AM


SSCrazy

SSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazySSCrazy

Group: General Forum Members
Last Login: Tuesday, March 26, 2013 8:41 AM
Points: 2,562, Visits: 3,451
another query
select name,[Phone],[Sms],[Email]
from
(
select name , mode , sum(case
when name = 'AAAAA' then 1
when name = 'BBBBB' then 1
when name = 'CCCCC' then 1 else 0 end) as cnt from @t
group by mode, name
)t
pivot
( sum (cnt)
for mode in ([Email],[Phone],[Sms])
)pvt
ORDER BY Name;

but i am unable to remove NULL.


-------Bhuvnesh----------
While 1 = 1 (Learning SQL....)
Click to get fast response of your post
Post #1404572
Posted Wednesday, January 09, 2013 11:53 PM


Ten Centuries

Ten CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen CenturiesTen Centuries

Group: General Forum Members
Last Login: Tuesday, May 14, 2013 4:11 AM
Points: 1,042, Visits: 1,438
If the values in the node column can be dynamic then you can do a Dynamic Cross tab as follows :

--Creating Table 

Create table Ex1
(
ID Int,
Name Varchar(30),
Mode Varchar(30)
)


--Inserting Sample Data

Insert into Ex1
Select 1, 'AAAAAAA', 'Phone'
Union ALL
Select 2, 'AAAAAAA', 'Phone'
Union ALL
Select 3, 'AAAAAAA', 'Phone'
Union ALL
Select 4, 'BBBBB', 'SMS'
Union ALL
Select 5, 'BBBBB', 'SMS'
Union ALL
Select 6,'CCCCC', 'Email'
Union ALL
Select 7, 'AAAAAAA', 'SMS'


--Dynamic Pivot

Declare @sql Varchar(Max)
Set @sql = 'Select Name, '
Select @sql = @sql + STUFF((Select ',SUM(Case When mode = ' + CHAR(39) + Mode + CHAR(39) + ' Then 1 Else 0 End) As ' + Mode From (Select Distinct Mode From Ex1) As a FOR XML Path('')),1,1,'')
Select @sql = @sql + ' From Ex1 Group By Name'
Execute (@sql)



Vinu Vijayan

For better and faster solutions please check..."How to post data/code on a forum to get the best help" - Jeff Moden
Post #1405218
« Prev Topic | Next Topic »

Add to briefcase

Permissions Expand / Collapse