繁体   English   中英

使用 COUNT 和 GROUP BY 的 DB2 SELECT 语句

[英]DB2 SELECT statement using COUNT and GROUP BY

我在 DB2 数据库中有一个表,其中包含我需要检索的客户信息以及表中特定列重复次数的计数。 这是数据的示例。

CUSTOMERID | CUSTOMERGROUP | PRODUCTID | PRODUCTNAME | ALERTNAME | ALERTLEVEL | XXX | YYY | ZZZ
12345        ABC             987654      ProductA      Alert1      4            More  Data  Here

客户由 CustomerID 和 CustomerGroup 列标识。 他们可以拥有任意数量的产品,这些产品会收到不同类型的警报(ProductA、ProductC 和 ProductQ 都可以收到 Alert1)。 我需要检索每一行的客户信息以及该客户获得特定警报名称的次数。

在我们旧的 MySQL 数据库中,这并不太难,因为我会做这样的事情

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, count(AlertName), AlertLevel, more data....
FROM TABLE
WHERE customerID = XXX and customerGroup = YYY
GROUP BY alertname
ORDER BY AlertLevel, AlertName, ProductName

group by 没有包含 select 语句中的每一列,因此我会为客户获取包含客户信息和他们收到特定警报次数的计数的行。

现在我们已经迁移到 DB2,我需要将 SELECT 中的每一列都放入 GROUP BY 中,这(显然)使每一行都不同,因此无论警报名称是否与另一个名称匹配,现在每行的计数都返回 1此客户的行。

有没有一种方法可以重新创建此功能,而无需对检索数据的方式进行重大修改? 作为前端的开发人员,我有能力改变我在 PHP 端操作数据的方式,我可以编写 SQL 语句,但我没有改变数据存储方式的选项。

您可以使用解析函数执行所需的操作:

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, AlertCount,
       AlertLevel, more data....
FROM (SELECT t.*,
             COUNT(*) OVER (PARTITION BY AlertName) as AlertCount,
             ROW_NUMBER() OVER (PARTITION BY AlertName ORDER BY customerID) as seqnum
      FROM TABLE t
      WHERE customerID = XXX and customerGroup = YYY
     ) t
WHERE seqnum = 1
ORDER BY AlertLevel, AlertName, ProductName;

您可以在单独的查询中计算计数,然后将其加入到原始查询中:

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, t2.alert_count as AlertName, AlertLevel, more data....
  FROM TABLE t1 JOIN (
       SELECT customerid, customergroup, count(AlertName) alert_count 
         FROM table
        GROUP BY alertname) t2 
    ON t1.customerid = t2.customerid
   AND t1.customergroup = t2.customergroup
 WHERE customerID = XXX
   AND customerGroup = YYY
 ORDER BY AlertLevel, AlertName, ProductName

在 DB2SQL 中,按列分组也应该在 select 中 但是,可以使用 Query/400 来实现这样的目标。 为此,请确保

  • “选择报表汇总功能”
  • “定义报告中断”

被正确选择。 保存此查询并调用它,例如 runqry。

或者试试这个:

With CTE1 (customerid, customergroup, Nbr_of_rows) as (
SELECT t1.customerid, t1.customergroup, count(t1.AlertName)
         FROM table t1
        WHERE t1.customerID = selected_Id
   AND t1.customerGroup = Selected_grp)
select * from CTE1
join table t2 on customerid = t2.customerid and customergroup = t2.customergroup
Order by columns_of_your_choice;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM