MySQL中的动态数据透视表

时间:2017-08-24 07:23:00

标签: mysql

我正在尝试基于200多个不同的值创建数据透视表。朋友已经准备好了我在T-SQL中需要的实例,但是ROW_NUMBER函数在MySQL中不可用,我无法将其翻译成我需要的东西。

UniqueTally值是在此之前出现了多少个Word的不同值的计数。下面的示例显示,当第3行再次出现“a”时,这不会增加UniqueTally,因为它也在第1行中。

我的数据如下:

表“Word”

| 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值。 Word索引是此成员的行条目号

| 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 个答案:

答案 0 :(得分:1)

模拟numericInput的直接方法是使用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;

此致

修改1

如果您运行此代码,是否使用1-3中的memberid获得以下输出并且rownumber正确递增?

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

修改2

以下是我如何使用会话变量在朋友伪代码中实现#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)

ROW_NUMBER

詹姆斯