我在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语句,但我无法改变数据的存储方式。
答案 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;