【问题标题】:sql Pivot how can I do thissql Pivot 我该怎么做
【发布时间】:2014-01-23 01:51:24
【问题描述】:
I have 3 tables
------------------------
users
1 ->    mark
2 ->    adel
3 ->    khali
4 ->    piter
5 ->    adam

------------------------
groups 
1 ->    group 1 
2 ->    group 2 
3 ->    group 3  
4 ->    group 4 
---------------------- 
usersGroups

1 ->    4
3 ->    2
4 ->    3
1 ->    2

I want to display 
if username has a group then 1 if it hasn't then 0 
 like this whith pivot but I dont know how ??? 


-- username     group1  group2  group3  group4
----------------------------------------------------
--  mark        0       1       0       1
--  adel        0       1       0       0
--  adam        0       0       1       0   



  I try this please help me


 SELECT username, [group1] AS 'group1', [group2] AS 'group2', [group3] AS 'group3', [group4] AS 'group4'    
    FROM 
    (
    SELECT  ug.groupid, ug.userid, g.description, u.username FROM users u 
                    INNER JOIN usersgroups ug ON u.userid = ug.userid 
                    INNER JOIN groups g ON ug.groupid = g.groupid 
    )AS q
    PIVOT
    (COUNT(groupid) FOR [description] IN ([group1],[group2],[group3],[group4])) AS pvt 

【问题讨论】:

  • 现在看看我已经更新了答案。

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

测试数据

DECLARE @users TABLE (userid INT, username NVARCHAR(100))
INSERT INTO @users
VALUES (1,'mark'),(2,'adel'),(3,'khali'),(4,'piter'),(5,'adam')

DECLARE @groups TABLE (groupid INT, [description] NVARCHAR(100))
INSERT INTO @groups
VALUES 
(1,'group 1'),(2,'group 2'),(3,'group 3'),(4,'group 4')

DECLARE @usersGroups TABLE (userid INT, groupid INT)
INSERT INTO @usersGroups
VALUES (1,4),(3,2),(4,3),(1,2)

查询

SELECT username
     , CASE WHEN  [group 1] IS NOT NULL THEN 1 ELSE 0 END AS 'group1'
     , CASE WHEN  [group 2] IS NOT NULL THEN 1 ELSE 0 END AS 'group2'
     , CASE WHEN  [group 3] IS NOT NULL THEN 1 ELSE 0 END AS 'group3'
     , CASE WHEN  [group 4] IS NOT NULL THEN 1 ELSE 0 END AS 'group4'    
    FROM 
    (
        SELECT  ug.groupid, ug.userid, g.description, u.username 
        FROM @users u INNER JOIN @usersGroups ug 
        ON u.userid = ug.userid 
        INNER JOIN @groups g 
        ON ug.groupid = g.groupid 
    )AS q
    PIVOT
    (MIN(groupid) 
    FOR [description] 
    IN ([group 1],[group 2],[group 3],[group 4])
    ) AS pvt 

结果集

╔══════════╦════════╦════════╦════════╦════════╗
║ username ║ group1 ║ group2 ║ group3 ║ group4 ║
╠══════════╬════════╬════════╬════════╬════════╣
║ mark     ║      0 ║      1 ║      0 ║      1 ║
║ khali    ║      0 ║      1 ║      0 ║      0 ║
║ piter    ║      0 ║      0 ║      1 ║      0 ║
╚══════════╩════════╩════════╩════════╩════════╝

【讨论】:

  • oh tnx tnx tnx 你是最棒的^_^
  • 没问题很高兴它有帮助:)
【解决方案2】:
SELECT  case when ug.groupid is null then 0 else 1 end as groupid, 
        ug.userid, g.description, u.username FROM users u 
LEFT JOIN usersgroups ug ON u.userid = ug.userid 
INNER JOIN groups g ON ug.groupid = g.groupid 

然后将聚合 COUNT(groupid) 更改为 MAX(groupid)

【讨论】:

  • 我按照你说的做 /* SELECT username, [group1] AS 'group1', [group2] AS 'group2', [group3] AS 'group3', [group4] AS 'group4' FROM (SELECT case when ug.groupid is null then 0 else 1 end as groupid, ug.userid, g.description, u.username FROM users u LEFT JOIN usersgroups ug ON u.userid = ug.userid INNER JOIN groups g ON ug .groupid = g.groupid )AS q PIVOT (MAX(groupid) FOR [description] IN ([group1],[group2],[group3],[group4])) AS pvt */ 但它显示所有结果为空?
猜你喜欢
  • 2018-01-16
  • 2012-05-26
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多