2014-07-18 46 views
1

我有一个查询拉取用户信息。从另一个表中添加基于列的值

SELECT UserID, CompanyID, FName, LName FROM tblUsers Where OrgType = 'business' 

我有另一个查询拉用户信息。

SELECT u.UserID, u.AccessID, t.AccessName FROM tblUserAccess as u Inner Join tblAccessType as t on u.AccessID = t.AccessID 

最后还有第三个查询拉取存取类型。

SELECT AccessID, AccessName, OrgType FROM tblAccessType WHERE OrgType = 'business' 

tblAccessType中可以有X个不同的访问类型。不同的访问类型将随着时间而增长。另外,用户可以拥有X个访问类型。

如何编写将以下列格式返回数据的查询?

UserID CompanyID FName LName SALES MARKET ADMIN FIN 

100 200  Jane Doe  *     * 

101 200  John Doe     * 

120 205  Mary Smith *    * 

121 205  Mark Smith *     * 

他是下面的示例数据。

tblUsers 

UserID CompanyID FName LName OrgType 

100  200  Jane Doe business 

101  200  John Doe business 

120  205  Mary Smith business 

121  205  Mark Smith business 

122  259  Fred Wilson charity 

tblUserAccess 

UserID AccessID 

100 1 

100 4 

101 3 

120 1 

120 3 

121 1 

121 4 


tblAccessType 

AccessID AccessName OrgType 

1  SALES  business 

2  MARKET  business 

3  ADMIN  business 

4  FIN  business 

5  NOTAX  charity 

6  SECURITY government 
+0

你需要通过Userid来转换访问类型,然后将其加入到用户中......您能否张贴一些示例源数据以及您可能已经尝试过的任何内容? – JiggsJedi

回答

0

你需要的是一个PIVOT ...我有一个动态PIVOT去,所以如果你添加新的AccessTypes,它们会自动添加。

如果你想省略NULL数据,然后更改''*'' AS AccessVal1 AS AccessVal,然后改变MAX([AccessVal])COUNT([AccessVal]) - 这会给你1/0,而不是*/NULL

IF OBJECT_ID('tempdb..#tblUsers') IS NOT NULL DROP TABLE #tblUsers 
IF OBJECT_ID('tempdb..#tblUserAccess') IS NOT NULL DROP TABLE #tblUserAccess 
IF OBJECT_ID('tempdb..#tblAccessType') IS NOT NULL DROP TABLE #tblAccessType 
IF OBJECT_ID('tempdb..##tblAccessPivot') IS NOT NULL DROP TABLE ##tblAccessPivot 

CREATE TABLE #tblUsers (UserID INT, CompanyID INT, FName VARCHAR(255), LName VARCHAR(255), OrgType VARCHAR(255)) 
CREATE TABLE #tblUserAccess (UserID INT, AccessID INT) 
CREATE TABLE #tblAccessType (AccessID INT, AccessName VARCHAR(255), OrgType VARCHAR(255)) 

INSERT INTO #tblUsers (UserID, CompanyID, FName, LName, OrgType) 
VALUES (100, 200, 'Jane', 'Doe', 'Business'), 
     (101, 200, 'John', 'Doe', 'Business'), 
     (120, 205, 'Mary', 'Smith', 'Business'), 
     (121, 205, 'Mark', 'Smith', 'Business'), 
     (122, 259, 'Fred', 'Wilson', 'Charity') 

INSERT INTO #tblAccessType (AccessID, AccessName, OrgType) 
VALUES (1, 'Sales', 'Business'), 
     (2, 'Market', 'Business'), 
     (3, 'Admin', 'Business'), 
     (4, 'Fin', 'Business'), 
     (5, 'NoTax', 'Charity'), 
     (6, 'Security', 'Government') 

INSERT INTO #tblUserAccess (UserID, AccessID) 
VALUES (100,1),(100,4), -- JANE 
     (101,3), -- JOHN 
     (120,1),(120,3), -- MARY 
     (121,1),(121,4) -- MARK 

DECLARE @cols AS NVARCHAR(MAX), 
     @sql AS NVARCHAR(MAX) 

SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()] 
FROM (SELECT DISTINCT AccessName AS y FROM #tblAccessType) AS Y 
ORDER BY y 
FOR XML PATH('')), 
1, 1, N'');   

SET @sql = 'SELECT UserID, CompanyID, Fname, LName, '[email protected]+' 
      INTO ##tblAccessPivot 
      FROM (SELECT U.UserID, U.CompanyID, U.Fname, U.LName, AT.AccessName, ''*'' AS AccessVal 
        FROM #tblUsers U 
        LEFT OUTER JOIN #tblUserAccess UA ON U.UserID=UA.UserID 
        LEFT OUTER JOIN #tblAccessType AT ON UA.AccessID=AT.AccessID) SUB 
      PIVOT (MAX([AccessVal]) FOR AccessName IN ('[email protected]+')) AS P' 
PRINT @SQL 
EXEC (@SQL) 

SELECT * 
FROM ##tblAccessPivot 
+0

谢谢!很棒! – crjunk

0

这里是要对这个如果你的访问类型保持(主要)静态的方式。它不涉及旋转,这总是一个加号。

DECLARE @tblUsers TABLE 
(
    UserID INT, 
    Name VARCHAR(50) 
) 

INSERT INTO @tblUsers SELECT 100, 'John Doe' 
INSERT INTO @tblUsers SELECT 101, 'Jane Doe' 

DECLARE @tblUserAccess TABLE 
(
    UserID INT, 
    AccessID INT 
) 

INSERT INTO @tblUserAccess SELECT 100, 1 
INSERT INTO @tblUserAccess SELECT 100, 4 
INSERT INTO @tblUserAccess SELECT 101, 3 

DECLARE @tblAccessType TABLE 
(
    AccessID INT, 
    AccessName VARCHAR(50) 
) 

INSERT INTO @tblAccessType SELECT 1, 'SALES' 
INSERT INTO @tblAccessType SELECT 2, 'MARKET' 
INSERT INTO @tblAccessType SELECT 3, 'ADMIN' 
INSERT INTO @tblAccessType SELECT 4, 'FIN' 


SELECT u.UserID 
    , u.Name 
    , [SALES] = MAX(CASE WHEN at.AccessName = 'SALES' THEN '*' ELSE ' ' END) 
    , [MARKET] = MAX(CASE WHEN at.AccessName = 'MARKET' THEN '*' ELSE ' ' END) 
    , [ADMIN] = MAX(CASE WHEN at.AccessName = 'ADMIN' THEN '*' ELSE ' ' END) 
    , [FIN] = MAX(CASE WHEN at.AccessName = 'FIN' THEN '*' ELSE ' ' END) 
FROM @tblUsers u 
JOIN @tblUserAccess ua 
    ON u.UserID = ua.UserID 
JOIN @tblAccessType at 
    ON ua.AccessID = at.AccessID 
GROUP BY u.UserID, u.Name 

和结果:

UserID Name SALES MARKET ADMIN FIN 
100 John Doe *      * 
101 Jane Doe     *  
相关问题