2017-08-24 112 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