sql—从多个表中计数到一组结果中

vlju58qv  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(479)

我有多个表,都有唯一的产品标识、用户标识和日期。
是否有任何方法可以显示单个表以显示每个用户id之间拆分的每个表中的计数。
我希望每个表名有一行,每个用户id有多列,行中有产品id的计数。
例如:

TblName user1 user2 user3
tbl1      1     2     3
tbl2      4     5     6
tbl3      7     8     9
tbl4      3     2     1

我觉得这将需要枢轴,但我不确定如何执行它。到目前为止,我已经能够搜索并找到构建生产数据库后端和正常运行的前端用户应用程序所需的一切,但这一点我无法实现。
对于某些上下文,请求的表将用于显示跨多个任务的员工的生产计数。如果可能的话,我想把日期作为存储过程的参数,这样我就可以在前端用户应用程序中创建一个排序滑块。
我读过几乎所有类似的问题,它们要么不是我想要的,要么没有解决,要么恰好是一个无法完成的请求。我觉得我的可能会落在后面。
我还认为,我可能只是在知道到底要寻找什么来找到我要寻找的答案时很糟糕。
请让我知道,如果有任何额外的信息需要满足我的要求。

huwehgph

huwehgph1#

可以使用条件聚合和 union all ```
select 'table1' as tablename,
sum(case when userid = 'user1' then 1 else 0 end) as user1,
sum(case when userid = 'user2' then 1 else 0 end) as user2,
sum(case when userid = 'user3' then 1 else 0 end) as user3
from table1
union all
select 'table2' as tablename,
sum(case when userid = 'user1' then 1 else 0 end) as user1,
sum(case when userid = 'user2' then 1 else 0 end) as user2,
sum(case when userid = 'user3' then 1 else 0 end) as user3
from table2
union all
. . .;

我看不出使用 `pivot` 在这里。但是,如果用户未知,则需要使用动态sql。
注意:这通常是在多个表中存储相同信息的坏数据模型的标志。通常,这些信息都应该在一个表中。
e4eetjau

e4eetjau2#

您可以尝试联合轴心方法:

SELECT
    TblName,
    COUNT(CASE WHEN userId = 'user1' THEN 1 END) AS user1,
    COUNT(CASE WHEN userId = 'user2' THEN 1 END) AS user2,
    COUNT(CASE WHEN userId = 'user3' THEN 1 END) AS user3
FROM
(
    SELECT 'tbl1' AS TblName, userId, productId FROM tbl1 UNION ALL
    SELECT 'tbl2', userId, productId FROM tbl2            UNION ALL
    SELECT 'tbl3', userId, productId FROM tbl3            UNION ALL
    SELECT 'tbl4', userId, productId FROM tbl4
) t
GROUP BY
    TblName;

相关问题