sql-server - 创建一个存储过程来聚合行

标签 sql-server azure stored-procedures aggregate

有一个包含以下行的事务表:

Id    UserId   PlatformId    TransactionTypeId
-------------------------------------------------
 0       1          3                1
 1       1          1                2
 2       2          3                2
 3       3          2                1
 4       2          3                1

如何编写一个存储过程,将行聚合到具有以下格式的新表中?

Id    UserId   Platforms          TransactionTypeId
-------------------------------------------------
 0      1      {"p3":1,"p1":1}    {"t1":1,"t2":1}
 1      2      {"p3":2}           {"t2":1,"t1":1}
 3      3      {"p2":1}           {"t1":1}

因此,行按用户分组,计算每个平台/交易类型并存储为键/值 json 字符串。

引用号:My previous related question

最佳答案

您可以使用GROUP BYFOR JSON:

SELECT MIN(ID) AS ID, UserId, MIN(sub.x) AS Platforms, MIN(sub2.x) AS Transactions
FROM tab t
OUTER APPLY (SELECT CONCAT('p', platformId) AS platform, cnt 
            FROM (SELECT PlatformId, COUNT(*) AS cnt
                  FROM tab t2 WHERE t2.UserId = t.UserId  
                  GROUP BY PlatformId) s
              FOR JSON AUTO) sub(x)
OUTER APPLY (SELECT CONCAT('t', TransactiontypeId) AS Transactions, cnt 
            FROM (SELECT TransactiontypeId, COUNT(*) AS cnt
                  FROM tab t2 WHERE t2.UserId = t.UserId  
                  GROUP BY TransactiontypeId) s
              FOR JSON AUTO) sub2(x)
GROUP BY UserId;

<强> DBFiddle Demo

结果有点不同(键值数组),但请将其视为起点。

关于sql-server - 创建一个存储过程来聚合行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018783/

相关文章:

sql-server - SQL Server 中 ASSEMBLIES 的用途是什么?

c++ - 为什么从客户端应用程序调用 SQL 引擎来调用 PL/SQL?

sql - EXECUTE AS OWNER 的存储过程是否可以有效替代从第三个模式表中选择的 View ?

sql - TSQL SELECT,然后在一个事务中进行UPDATE,然后返回SELECT

SQL Server 事务处理

sql-server - 如何在合并中插入多行?

sql - T-SQL While 循环和串联

Azure函数: "Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information"

c# - 有没有什么方法可以在不轮询的情况下在服务器中查找新消息?

azure - 维护 azure 资源管理器模板的正确方法