2017-08-24 115 views
0

我試圖根據200多個不同的值創建數據透視表。一位朋友已經準備好了一個我在T-SQL中需要的工作示例,但是ROW_NUMBER函數在MySQL中不可用,我無法將其轉換爲我所需要的。MySQL中的動態數據透視表

UniqueTally值是Word在此之前出現了多少個不同值的計數。下面的例子表明,「A」再次出現在第3行的時候,這不增加UniqueTally,因爲它也是第1行中

我的數據是這樣的:

表「字」

| WordID  | MemberID | Word  | UniqueTally 
| 1   | 1   | a  | 1 
| 2   | 1   | b  | 2 
| 3   | 1   | a  | 2 
| 4   | 2   | c  | 1 
| 5   | 2   | d  | 2 
| 6   | 2   | e  | 3 

我有200多個會員,我正在嘗試創建一個表格,顯示所有成員的唯一計數如何增加。即按會員調整UniqueTally值。字索引是該成員

| WordIndex | UniqueTallyMember1 | UniqueTallyMember2 | etc 
| 1   | 1     | 1   
| 2   | 2     | 2   
| 3   | 2     | 3   

有朋友好心生成我需要在T-SQL代碼中的行條目號:

/* Return the data */ 
SELECT 
    [WordSpoken] 
    ,[182] AS [Mem182_UniqueTally] 
    ,[200] AS [Mem200_UniqueTally] 
FROM (
    SELECT [WordSpoken], [MemberID], [UniqueTally] 
    FROM (
      SELECT 
       ROW_NUMBER() OVER(PARTITION BY [MemberID] ORDER BY 
[WordID]) AS [WordSpoken] 
       ,[MemberID] 
       ,[UniqueTally] 
      FROM [dbo].[ut_test] 
     ) AS [test] 
    ) AS [tbl] 
PIVOT (MAX(UniqueTally) FOR MemberID IN ([182],[200])) AS [pvt] 
GO 

這僅使用2 MEMBERID值,但它在儘可能的作品對齊唯一值。 我在MySQL中需要類似的東西,它也動態地獲取MemberID。這可能嗎?

我試過谷歌搜索和搜索其他類似的帖子,但我無法將這些直接轉化爲我的問題。

回答

1

模擬ROW_NUMBER的直接方法是使用ORDER BY有條件地增加會話變量。看到這個例子:

#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo; 
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED); 

INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1); 

SET @VMemberID := 0, @VCounter := 0; 

#Ensure data is correctly ordered 
#DROP TEMPORARY TABLE IF EXISTS sessionVarDemoOrdered; 
CREATE TEMPORARY TABLE sessionVarDemoOrdered SELECT memberId FROM sessionVarDemo ORDER BY memberId; 

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemoOrdered A; 

請注意,這是可能的,而不取決於您的本地設置像這樣的東西臨時表:

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A; 

問候,

編輯1

如果你運行這段代碼,你是否會得到以下輸出,其中1-3的成員id和rownumber incrementing corr ectly?

#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo; 
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED); 

INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1); 

SET @VMemberID := 0, @VCounter := 0; 

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A; 

+-----------+----------+ 
| rowNumber | memberId | 
+-----------+----------+ 
|   0 |  1 | 
|   1 |  1 | 
|   2 |  1 | 
|   3 |  1 | 
|   4 |  1 | 
|   5 |  1 | 
|   6 |  1 | 
|   7 |  1 | 
|   0 |  2 | 
|   1 |  2 | 
|   2 |  2 | 
|   3 |  2 | 
|   4 |  2 | 
|   5 |  2 | 
|   6 |  2 | 
|   7 |  2 | 
|   0 |  3 | 
|   1 |  3 | 
|   2 |  3 | 
|   3 |  3 | 
+-----------+----------+ 
20 rows in set (0.00 sec) 

編輯2

以下是我會實現你的朋友的ROW_NUMBER使用會話變量僞代碼:

SET @VMemberID := 0, @VCounter := 0; 

/* Return the data */ 
SELECT 
    [WordSpoken] 
    ,[182] AS [Mem182_UniqueTally] 
    ,[200] AS [Mem200_UniqueTally] 
FROM (
    SELECT [WordSpoken], [MemberID], [UniqueTally] 
    FROM (
      SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId 
      FROM [dbo].[ut_test] 
      ORDER BY [WordSpoken] 
       ,[MemberID] 
       ,[UniqueTally] 
     ) AS [test] 
    ) AS [tbl] 
PIVOT (MAX(UniqueTally) FOR MemberID IN ([182],[200])) AS [pvt] 
GO 

詹姆斯

+0

感謝詹姆斯,雖然我不確定如何把它放入查詢其餘部分的上下文中的嵌套選擇 – danjp

+0

向答案添加了一點,可以你回到我身邊? –

+0

謝謝,雖然每個成員都需要一個獨特的專欄。這段代碼(沒有Pivot)生成cols但不是正確的值。我會繼續'SET @VMemberID:= 0,@VCounter:= 0; SELECT 182 AS M182_UniqueTally ,200 AS M200_UniqueTally FROM(SELECT MEMBERID,UniqueTally FROM( \t \t SELECT @VCounter:= IF(@VMemberID = MEMBERID,0,@VCounter + 1)UniqueTally,@VMemberID! = MEMBERID MEMBERID \t \t FROM WordShort )作爲試驗 )AS TBL PIVOT( \t MAX(UniqueTally)FOR MEMBERID IN(182200) )AS pvt' – danjp