2017-01-01 64 views
0

我有3個表:左加入3個表,並顯示一個類似的動態樞軸

payorderType : 
--------- 
typeID | TypeName | 
    1 | accounting | 
    2 | budget  | 
----------   
step: 
---------- 
StepID | StepName | typeID 
    1 | payorder | 1 
    2 | cheque  | 1 
    3 | cheque  | 2 

---------- 
user: 
---------- 
    userID | StepName | StepID 
    7878 | payorder | 1 
    4547 | cheque  | 2 
    6538 | cheque  | 1 


---------- 

我想使哪些用戶存在於行和列包括與步驟和payorderType的CONCAT的表。下同:

  users | accounting_payorder | accounting_cheque | budget_cheque | 
      7878 |   1   |  0   |  0  | 
      4547 |   0   |  1   |  0  | 
      6538 |   0   |  1   |  0  | 

我quesdtion是:如果我不知道payorderType行和步行數數,我應該怎麼寫呢? 我的腳本是在這裏: 首先,我在光標創建一個表CONCAT payorderType和步:

CREATE PROC sp_payOrderType 

AS 

BEGIN 

    DECLARE a CURSOR 

    FOR SELECT DISTINCT p.TypeName,s.StepName 
    FROM 
     dbo.PayOrderType p LEFT JOIN 
     dbo.vStep s ON s.TypeID = p.TypeID 
    FOR READ ONLY 

    DECLARE @payOrderType NVARCHAR(50),@stepName NVARCHAR(50) 
    DECLARE @SQL NVARCHAR(MAX)='' 

    OPEN a 
    FETCH NEXT FROM a INTO @payOrderType, @stepName 
    WHILE @@FETCH_STATUS=0 

    BEGIN 
     DECLARE @b VARCHAR(max), @b2 VARCHAR(max) 

     SELECT @b = ISNULL(@b ,'') +'['+ ISNULL(@payOrderType ,'')+ '____'+ISNULL(@stepName ,'')+ ']'+ ' NVARCHAR(1000) ,' 

     FETCH NEXT FROM a INTO @payOrderType,@stepName  
    END 

    CLOSE a 
    DEALLOCATE a 
    SELECT @SQL = 'ALTER table AA(' + SUBSTRING(@b,1, LEN(@b)-1) + ')' 
    SELECT @SQL 

END 

,但我不知道我應該如何與同列的行(用戶ID)?

+2

可能重複的[SQL Server動態PIVOT查詢?](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – GurV

回答

0

您應該確定輸出結構。它具有可變的產出結構,風險很小。

但在這裏,我們去:

  1. 讓你的結構簡單(去除大部分的變量) - 創建視圖(或使用派生表)payorderType +步

    -- should be inner join probably instead of left join 
    -- if you use left join you have to isnull s.StepName 
    SELECT 
        u.userID, 
        s.StepID, 
        p.TypeName, 
        s.StepName, 
        p.TypeName + '_' + s.StepName StepType, 
        -- Your column can be like `coalesce(p.TypeName + '_' + s.StepName, p.TypeName, s.StepName) StepType` for left joins 
        1 Point 
    FROM dbo.PayOrderType p 
    INNER JOIN dbo.vStep s ON s.TypeID = p.TypeID 
    INNER JOIN dbo.user u ON u.StepID = s.StepID 
    

讓你查詢更加清晰(可以將所有的字段都設爲空值?現在,您只能使用一個列/變量)

  1. 現在是時候爲支點:

    SELECT 
        userID, 
        [accounting_payorder], 
        [accounting_cheque], 
        [budget_cheque] 
    FROM newview v 
    PIVOT(MAX(point) FOR StepType in ([accounting_payorder], [accounting_cheque], [budget_cheque]) 
    
  2. 如果需要,您可以使用動態查詢:

    declare @header varchar(max), 
         @columns varchar(max) 
    
    select @header = coalesce(@header + ', ', '') + 'isnull(''' + StepType + ''', 0) ' + '[' + StepType + ']', 
         @columns = coalesce(@columns + ', ', '') + '[' + StepType + ']' 
    from newview 
    group by StepType 
    
    declare @sqlpvt varchar(4000) -- limited by lenght of exec statement 
    set @sqlpvt = 'select userID, $HEADER FROM newview v PIVOT(MAX(point) FOR StepType in ($COLUMNS)' 
    -- replace pseudovariables 
    set @sqlpvt = replace(@sqlpvt, '$HEADER', @header) 
    set @sqlpvt = replace(@sqlpvt, '$COLUMNS', @columns) 
    
    print @sqlpvt 
    exec (@sqlpvt) 
    

很抱歉,如果somethink是錯誤的(所著盲目的),但我認爲爲了指導就足夠了。但你應該更喜歡結束第2步(非靜態代碼是危險的)。