如何在Oracle中同时聚合和字符串连接?

时间:2018-10-01 19:47:39

标签: oracle aggregate-functions listagg

我有如下数据:

['146', '147', '155', '156', '156 Sportwagon', '159', '159 Sportwagon', '164', '166', '2000', '4C', '8C', 'Brera', 'Giulia', 'Giulietta', 'GT', 'GTV', 'MiTo', 'Spider', 'Stelvio']

并且我正试图获得如下所示的结果:

Customer      Product     Amount
   A           Table        500  
   A           Table        300
   A           Chair        100
   B           Rug           50
   B           Chair        200

在MSSQL中,我可以使用XML PATH('')并轻松到达那里。我对Oracle不那么精通。我尝试使用LISTAGG,这是我得到的:

Customer      Product        Amount
   A           Table, Chair    900  
   B           Rug, Chair      250

所以我在Product字符串中得到了重复项,并且总金额是相同的。在这里研究一些类似的问题时,我找不到如何同时进行聚合和不同的listagg。这是我的尝试:

Customer      Product                 Amount
   A           Table,Table,Chair       1150  
   B           Rug, Chair              1150

这会稍微靠近并产生以下结果:

Select
 Customer
,sum(Amount) as "Amount"
,LISTAGG(Product, ', ') WITHIN GROUP(Order by CUSTOMER) as "TestingThis"
From
(Select 
  A.Customer
 ,B.Product
 ,B.Amount
 ,Row_Number() over (Partition by A.Customer, B.Product order by A.Customer) as rn
  From
  CustomerTable A
  left join ProductTable B
  on A.ID = B.ID
  Group by
  A.Customer
 ,B.Product
 ,B.Amount
)
 where rn = 1
 Group by Customer

请注意,它仅在rn = 1时才进行求和,因此它缺少其余的金额。

使用Oracle 11g,因此如果他们在新版本中为LISTAGG提供了一些新颖的“独特”功能,那么它对我没有帮助。

从MSSQL到PLSQL的转换很痛苦。这在MSSQL中非常容易做到。我不明白如果无法轻松获得独特的价值,LISTAGG可能甚至会有用吗?

除了独特的LISTAGG之外,我在这里找到的最接近的解决方案没有考虑进行其他合计,例如总和。他们只是说,“如果您需要使用LISTAGG进行另一次聚合,那会很棘手”。

好吧,这正是我所需要的。 :(

1 个答案:

答案 0 :(得分:1)

这会吗?

    WebDriverWait wait = new WebDriverWait(driver, LOADING_TIMEOUT);

    WebElement webElement;
    try {
        driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
        webElement = wait.until(elementToBeClickable(By.id(id)));
    } catch (TimeoutException ex) {
        // Delay any further interaction until the timeout has been restored
        webElement = null;
    } finally {
        driver.manage().timeouts().implicitlyWait(DEFAULT_TIMEOUT,
                TimeUnit.SECONDS);
    }

    if (webElement != null)
        webElement.click();
    else
        // Close loading window