嘿,我想要从我的oracle DB中显示一些数据。我希望通过普通数据/专栏对其进行分组,但无法弄明白。
$stid = oci_parse($conn, " SELECT REQ.REQSTN_NO, REQ.WO_NO, REQ.COST_CENTRE_CD, REQ.ACCT_PRIME_CD, REQ.ACCT_SUBSDRY_CD, REQ.STOCK_CD
FROM TE.REQSTNREQ
WHERE REQ.DEPT_CD='ISN'");
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_BOTH+OCI_RETURN_NULLS)) != false) {
echo $row['COST_CENTRE_CD']."-".$row['ACCT_PRIME_CD']."-".$row['ACCT_SUBSDRY_CD']." ".$row['WO_NO']." ".$row['REQSTN_NO']." ".$row['STOCK_CD']."<br />";
}
我想创建一个像这样的输出
我已经尝试了Group BY
和SUM/COUNT
,但我不知道如何正确构建代码,任何帮助都会受到赞赏。
答案 0 :(得分:0)
这不是真正的数据库“分组” - 这是一个显示问题:您希望将具有公共列值的行组合在一起并仅打印每个共享列值一次。
此类显示问题最好留给应用程序的表示层,最好不要在SQL /数据模型层之外。
尽管如此,这里有一种技术可用于将公共列值组合在一起,并使用SQL打印每个值一次。
(由于您未以文本形式提供数据,因此本示例使用T& operator *()
{
return (*array)[currentPosition];
}
来说明该技术。
DBA_OBJECTS
这个想法是SELECT
-- Order the row_number () partitions the same way the overall query is ordered...
case when row_number() over (partition by object_type order by object_type, owner, object_name) = 1 THEN object_type ELSE NULL END object_type,
case when row_number() over (partition by object_type, owner order by object_type, owner, object_name) = 1 THEN owner ELSE NULL END owner,
object_name,
created, last_ddl_time
FROM dba_objects o
ORDER BY
-- Important to qualify columns in ORDER BY...
o.object_type, o.owner, o.object_name;
语句检查这是否是新共享公共值中的第一行,并且只有这样才能打印列值。否则,它会打印case
。
答案 1 :(得分:-1)
您需要使用对象关系数据库来实现这样的结果。
编辑回答:
在MySQL中,您可以使用以下函数:GROUP_CONCAT:
参见参考:https://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat
我相信在oracle中有类似的解决方案。您需要参考以下问题: Is there any function in oracle similar to group_concat in mysql?