使用COUNT和GROUP BY的DB2 SELECT语句

时间:2014-04-21 13:27:05

标签: sql database db2

我在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 name与此客户的另一行匹配。

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

3 个答案:

答案 0 :(得分:4)

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

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;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在 DB2SQL 中,按列分组也应该在选择中。但是,可以使用 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;