【问题标题】:Oracle SQL Crosstab with Sum带有 Sum 的 Oracle SQL 交叉表
【发布时间】:2019-05-13 08:17:50
【问题描述】:

我是 Oracle SQL 的新手,我的任务是使用 SQL 创建交叉表报告。我有一个简单的源表,其结构类似于:

我正在尝试交叉表显示每个州的员工总数,如下所示:

理想情况下,我想动态地满足在新州开设的办事处的需求。

我一直在研究 PIVOTS,但似乎无法理解它。任何指导将不胜感激。

谢谢。

【问题讨论】:

    标签: sql oracle pivot crosstab


    【解决方案1】:

    PIVOT 中,您可以从源子查询开始。
    然后,您定义要聚合另一个字段中的哪些标题的字段。

    SELECT *
    FROM
    (
      SELECT Company, State, Staff
      FROM YourCompanyStaffTable
      WHERE State IN ('Illinois', 'Texas', 'Tennessee', 'Missouri', 'Kansas', 'Indiana')
    ) src
    PIVOT (
      SUM(Staff)
      FOR State IN (
        'Illinois' as Illinois, 
        'Texas' as Texas, 
        'Tennessee' as Tennessee, 
        'Missouri' as Missouri, 
        'Kansas' as Kansas, 
        'Indiana' as Indiana
      )
    ) pvt
    ORDER BY Company
    

    在此查询中,新列名是从“状态”列生成的。
    请注意,在源查询中,这些名称也有限制。
    这只是出于效率的原因。 (从表中提取的数据更少)

    它会按 PIVOT 声明中未使用的源字段对结果进行分组。
    在这种情况下,它会自动在“公司”列中分组。

    因此,它将每个“公司”的每个“州”的“员工”总数相加。

    【讨论】:

    • @Fearthegrimp 在这样的情况下,您可以通过喜欢某人的回答来感谢他们;)每个喜欢他们都会获得 10 名声望。 -2 表示反对票。但只有当你觉得它符合该按钮的描述时才这样做:“这个答案很有用”。再说一次,我认为您首先必须获得 15 声望才能投票。 SO 根据您的声誉授予权利。
    【解决方案2】:

    用例当

    select company, sum(case when state='Illinois' then staff else 0 end) as  Illinois,
     sum(case when state='Texas' then staff else 0 end) as  Texas,
     sum(case when state='Tennessee' then staff else 0 end) as  Tennessee,
     sum(case when state='Missouri' then staff else 0 end) as  Missouri,
     sum(case when state='Kansas' then staff else 0 end) as  kansas,
    sum(case when state='Indiana' then staff else 0 end) as  Indiana from t
    group by company
    

    【讨论】:

    • 这样。 2 块石头杀死一只鸟 :)
    • @Fearthegrimp 但您只能接受 SO 中的一颗石头 :)
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多