MySQL中的动态透视表
我正在尝试创建一个基于200多个不同值的透视表。一位朋友准备了一个我在T-SQL中需要的工作示例,但是在MySQL中没有行数函数,我无法将其转换为我需要的 UniqueTally值是Word在这个值之前出现的不同值的计数。下面的示例显示,当a再次出现在第3行中时,这不会像第1行一样增加唯一性 我的数据如下所示:MySQL中的动态透视表,mysql,Mysql,我正在尝试创建一个基于200多个不同值的透视表。一位朋友准备了一个我在T-SQL中需要的工作示例,但是在MySQL中没有行数函数,我无法将其转换为我需要的 UniqueTally值是Word在这个值之前出现的不同值的计数。下面的示例显示,当a再次出现在第3行中时,这不会像第1行一样增加唯一性 我的数据如下所示: SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := mem
SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;
表字
| 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多个成员,我正在尝试创建一个表,显示所有成员的唯一计数是如何增加的。即,按成员对齐唯一值。Word index是此成员的行条目号
| 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。这可能吗
我已经尝试过谷歌搜索其他类似的帖子,但我无法将它们直接转化为我的问题。模拟行数的直接方法是使用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
如果您运行此代码,您是否会获得memberid为1-3且行号正确递增的以下输出
#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
下面是我如何使用会话变量在friends伪代码中实现ROW_编号:
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
James谢谢James,虽然我不知道如何将其放入查询其余部分的嵌套选择中。在回答中添加了一点,你能给我回电话吗?谢谢,尽管每个成员都需要一个唯一的列。这段没有Pivot的代码生成COL,但不是正确的值。我将继续设置@VMemberID:=0、@VCounter:=0;从SELECT MemberID中选择182作为M182_唯一,从SELECT@VCounter中选择200作为M200_唯一,从SELECT@VCounter:=IF@VMemberID != MemberID,0,@VCounter+1 uniquetaly,@VMemberID:=WordShort中的MemberID MemberID作为测试作为tbl PIVOT MaxUniquetaly作为PVT在182200中作为MemberID你能用代码从我的编辑中明确回答这个问题吗?“如果您运行此代码,您是否会得到以下输出,memberid为1-3,行数正确递增?’,如果我知道这一点,我可以尝试修改您的查询。此代码根据您的输出集@VMMemberID:=0,@VCounter:=0,为我提供相同列中的所有成员;选择@VCounter:=IF@VMemberID != MemberID,0,@VCounter+1唯一,@VMMemberId:=MemberID根据MemberID从WordShort ORDER中提取MemberID;