2013-06-29 125 views
0

你們中的任何一位好心人請幫忙!!用戶定義字段的MS Access PIVOT

我需要查詢下面顯示的源表。 (NULL是空白字段)

UNUM Ticket Overflow 
1 135 NULL 
1 136 NULL 
1 137 NULL 
1 138 NULL 
1 NULL 2b 
2 135 NULL 
2 136 NULL 
2 137 NULL 
3 135 NULL 
3 136 NULL 
3 137 NULL 
3 138 NULL 
3 139 NULL 
3 140 NULL 
3 NULL 66a 
4 NULL 12a 
5 NULL 14a 

我需要生成如下所示的輸出。

UserNum Ticket1 Ticket2 Ticket3 Ticket4 Ticket5 Ticket6 Ticket7 Ticket8 Ticket9 Overflow 
1  135  136  137  138  Null  Null Null Null Null 2b 
2  135  136  137  Null Null  Null Null Null Null Null  
3  135  136  137  138  139  140 Null Null Null 66a 
4  Null Null Null Null Null  Null Null Null Null 12a  
5  Null Null Null Null Null  Null Null Null Null 14a 
  1. 源表具有分配給用戶的多個票。總共最多有9張門票。
  2. 用戶要麼有票證要麼溢出,但這裏只能是每個用戶溢出。

我有問題樞門票列中的數據,以預先定義的一樣Ticket1,Ticket2字段名...

+0

你用什麼邏輯爲Ticket1等賦值?但請注意,您不應該依賴Access存儲這些值的順序。Access對此順序不作任何保證。爲了實現這一點,您需要在表格中創建一個附加編號或日期標記的列。但是如果您知道每個值適用於哪個票證號碼,那麼這些票證號碼應該存儲在表格中。 –

回答

0

(對於這個答案,我已經使用[TicketJournal]作爲源的名稱表)。

首先,我們需要爲交叉表(數據透視表)準備數據。我們可以通過聚集在實現這一目標的不平等自聯接源表,生成「門票」行,然後UNION-ING是一個簡單的SELECT源表的「溢出」

SELECT 
     UNUM AS UserNum, 
     CStr(Ticket) AS Item, 
     "Ticket" & COUNT(Ticket) AS Destination 
    FROM 
     (
      SELECT tj1.UNUM, tj1.Ticket 
      FROM 
       TicketJournal tj1 
       INNER JOIN 
       TicketJournal tj2 
        ON tj1.UNUM=tj2.UNUM 
         AND tj1.Ticket>=tj2.Ticket 
     ) 
    GROUP BY UNUM, Ticket 
UNION ALL 
    SELECT 
     UNUM AS UserNum, 
     Overflow AS Item, 
     "Overflow" AS Destination 
    FROM TicketJournal 
    WHERE Overflow IS NOT NULL 

保存在Access爲[TicketCrosstabSource]該查詢,然後運行它以驗證它返回

UserNum Item Destination 
------- ---- ----------- 
     1 135 Ticket1  
     1 136 Ticket2  
     1 137 Ticket3  
     1 138 Ticket4  
     2 135 Ticket1  
     2 136 Ticket2  
     2 137 Ticket3  
     3 135 Ticket1  
     3 136 Ticket2  
     3 137 Ticket3  
     3 138 Ticket4  
     3 139 Ticket5  
     3 140 Ticket6  
     1 2b Overflow 
     3 66a Overflow 
     4 12a Overflow 
     5 14a Overflow 

現在我們可以做對[TicketCrosstabSource]查詢交叉表查詢...

TRANSFORM First(TicketCrosstabSource.[Item]) AS FirstOfItem 
SELECT TicketCrosstabSource.[UserNum] 
FROM TicketCrosstabSource 
GROUP BY TicketCrosstabSource.[UserNum] 
PIVOT TicketCrosstabSource.[Destination] In ("Ticket1","Ticket2","Ticket3","Ticket4","Ticket5","Ticket6","Ticket7","Ticket8","Ticket9","Overflow"); 

...返回

UserNum Ticket1 Ticket2 Ticket3 Ticket4 Ticket5 Ticket6 Ticket7 Ticket8 Ticket9 Overflow 
------- ------- ------- ------- ------- ------- ------- ------- ------- ------- -------- 
     1 135  136  137  138             2b  
     2 135  136  137                  
     3 135  136  137  138  139  140         66a  
     4                     12a  
     5                     14a