数据透视表计数不正确

Posted

技术标签:

【中文标题】数据透视表计数不正确【英文标题】:pivot table not counting properly 【发布时间】:2021-04-12 01:36:50 【问题描述】:

我正在尝试使用数据透视表来按地区显示产品销售数量(总销售单位)。

这是期望的结果:

这是我的代码:

select * from 
(
    select p_code, reg_name, sale_units
    from dwregion, dwsalesfact
)
pivot
(
    sum(sale_units)
    for reg_name
    in ('ne', 'nw', 'se', 'sw')
)

这目前为我提供了我正在寻找的交叉表格格式,但是这些值都是空的(因为它们在每个单元格中都有一个短划线)

我也尝试过count(sale_units),但我的数据透视表中最后是 0。

如何解决这个问题以获得我想要的输出?

我也在使用Oracle live,你可以找到脚本文件here。

编辑: 尽管 Paul Maxwell 在代码块中显示了正确的连接语句,但我将 mathguy 标记为具有最佳解决方案,因为他在回答中提到了 Paul,并确定并解决了为什么我没有收到输出。

【问题讨论】:

请分享充足的数据 我刚刚看到你的EDIT。虽然 Paul Maxwell 显示了对您查询的 join 部分的更正,但他的回答实际上并没有解决主要问题 - 他在 PIVOTIN 列表中仍然具有相同的值,以小写形式显示.他没有确定您没有得到任何结果的原因,这是您提出的问题(而他确实确定了一个不同的问题并解释了如何解决它)。我相信这是将我的答案标记为“正确”答案的更好理由 - 它实际上回答了您的具体问题。 【参考方案1】:

表和列名(以及其他标识符)通常不区分大小写,因此您可以将表称为EMPLOYEESemployeesEmployees 等。

但文本值并非如此,在PIVOT 运算符的IN 列表中,您正在使用的是:区域名称的文本值。在您的表中,它们被定义为'NE''NW' 等,但在您的查询中,您将它们引用为'ne''nw' 等。您可能在'NE' 区域有大量销售,但在'ne' 地区根本没有;实际上,您的表中甚至不存在该区域。对你和我来说,'ne' 可能看起来与 'NE' 相同,但对计算机来说却不是 - 除非你以某种方式告诉它,而在你的情况下,你没有。

Paul Maxwell 关于缺少的连接条件可能是正确的,但我刚才解释的原因是您根本没有得到任何计数。您可能需要使用两个答案的建议来修复您的查询。

【讨论】:

【参考方案2】:

您尚未建立从事实表到区域的任何明确关系。 (虽然您创建了一个笛卡尔积/交叉连接,但这在这里并不准确。)我认为您需要同时连接客户表和区域表:

SELECT *
FROM (
    SELECT fact.p_code
         , reg.reg_name
         , fact.sale_units
    FROM dwsalesfact fact
    INNER JOIN DWCUSTOMER cust ON fact.cus_code = cust.cust_code
    INNER JOIN DWREGION reg ON cust.reg_id = reg.reg_id
    )
PIVOT(
    SUM(sale_units) 
    FOR reg_name IN ( 'ne' ,'nw' ,'se' ,'sw' )
    )

【讨论】:

以上是关于数据透视表计数不正确的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 数据透视表值计数

使用 Redshift (PostgreSQL) 和计数的数据透视表

带有计数和总和的 SQL Server 数据透视表

LibreOffice创建数据透视表

带有计数的数据透视表 if

如何连接 Excel 数据透视表中的值,而不是求和或计数