2014-01-05 53 views
1
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 
+0

現在看一看我已經更新了答案。 –

回答

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 ║ 
╚══════════╩════════╩════════╩════════╩════════╝ 
+0

但如果標有[組4] 2次它顯示2 –

+0

@ user3163007是的,看看我已經更新了答案 –

+0

哦tnx tnx tnx你是最好的^ _^ –

0
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)

+0

我這樣做,像你說 /* SELECT用戶名,[1組] AS '硫基',[第2組] AS '組2',[組3] AS '組3',[組4] AS 'GROUP4' FROM ( 選擇情況下,當ug.groupid爲空然後爲0其他1結束爲組ID, 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 )爲q PIVOT (MAX(GROUPID)FOR [描述]([組1],[第2組],[第3組],[組4]))AS PVT */ 但它顯示所有結果爲空? –

相關問題