将某些行组合在一起

Grouping certain rows together

    <?php 
error_reporting(E_ALL);
ini_set('display_errors' ,1);
require "connection.php";


$query= "SELECT client_id, array_agg(insurance) AS insurance from vouchers WHERE parsing_date=CURRENT_DATE GROUP BY client_id ";
$result = pg_query($conn,$query);


?>

<!DOCTYPE html>
<html>
<head>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<link href = "http://fonts.googleapis.com/css?family=Roboto:400">

<style>
.responstable {
  margin: 1em 0;
  width: 100%;
  overflow: hidden;
  background: #FFF;
  color: #024457;
  border-radius: 10px;
  border: 1px solid #167F92;
  word-wrap: break-word;
}

</style>

</head>

<body>
<div class="container-fluid">
        <div>

          <h1>Clients</h1>


        </div>

<table class="responstable" rules='all' style='border-collapse: collapse;'>
<thead>
    <tr>
        <th>Client id</th>
        <th>Insurance</th>
        <th>Number of rows</th>

    </tr>
</thead>
  <?php 
    while($row = pg_fetch_array($result))
    { 


  ?>

  <tbody>


     <td><?php echo $row['client_id']; ?></td>
     <td><?php echo $row['insurance']; ?></td> 
     <td><?php echo $row['rows'];?></td>    
    </tr>
  <?php  }


  ?>  </tbody>
</table>

</div>

</body>
</html>

我有上面的代码来生成我的输出:

Client id           Insurance
------------        ---------------
123                      {"AA","EE","U"}
125                      {"AA","UE"}
126                     {"CU"}
124                      {"UE"}

我想要这个:

Client id          Number of rows                  Insurance 
------------       -----------------------        --------------
123                          3 rows                   AA,EE,U
125                          2 rows                   AA,UE
126                          1 rows                   CU
124                          1 rows                   UE

我不确定如何修复它,我尝试将此行添加到我的查询中:

concat(count(*), ' rows') AS rows

但它只是给了我一个错误,关于我可以做些什么来让行出现并且“{”和“””消失有什么想法吗?

你可以使用explode功能。 试试这个代码

<?php while ( $row = pg_fetch_array ( $result ) ) { ?>
<tr>
    <td><?php echo $row['client_id']; ?></td>
    <td><?php echo implode(',',json_decode($row['insurance'])); ?></td>
    <td><?php 
        $sRows = '';
        if($row['iCnt'] > 0) {
            $sRows = $row['iCnt']==1?' row':' rows';
        }                   
        echo ''.$row['iCnt'].$sRows;
    ?></td>
</tr>

改成这样查询

SELECT client_id, concat(cast(count(*) AS char),' rows')

这在 mysql 中效果很好。您必须键入 cast integerstring 才能连接

http://www.mysqltutorial.org/mysql-cast/

对于 PostgreSQL 应该是这样的,

SELECT client_id,
   count(*) AS cnt,
   ''||count(*)||' rows' AS concatString

https://www.postgresql.org/docs/8.3/static/functions-string.html

您可以像这样在查询中添加 If 和 else

  SELECT client_id, 
  CASE WHEN count(*)>0 THEN 
        CASE WHEN count(*)==1 THEN ''||count(*)||' row'
        ELSE ''||count(*)||' rows' END  
  ELSE ''
  END AS concatenatedString

我不知道性能如何

Postgres nested if in case query

您想使用 array_to_string:

SELECT
    client_id,
    concat(count(*), ' rows'),
    array_to_string(array_agg(insurance),',') AS insurance
FROM vouchers
WHERE parsing_date=CURRENT_DATE
GROUP BY client_id

JSON解析和查询问题已解决

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );
require "connection.php";           
$query = "SELECT client_id,
        count(*) AS iCnt,
        array_agg(insurance) AS insurance from vouchers 
        WHERE parsing_date=CURRENT_DATE GROUP BY client_id ";
$result = pg_query ( $conn, $query );       
?>
<!DOCTYPE html>
<html>
<head>
<link
    href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css"
    rel="stylesheet">
<link href="http://fonts.googleapis.com/css?family=Roboto:400">
<style>
.responstable {
    margin: 1em 0;
    width: 100%;
    overflow: hidden;
    background: #FFF;
    color: #024457;
    border-radius: 10px;
    border: 1px solid #167F92;
    word-wrap: break-word;
}
</style>
</head>
<body>
    <div class="container-fluid">
        <div>
            <h1>Clients</h1>
        </div>
        <table class="responstable" rules='all' style='border-collapse: collapse;'>
            <thead>
                <tr>
                    <th>Client id</th>
                    <th>Insurance</th>
                    <th>Number of rows</th>

                </tr>
            </thead>
 <tbody>
<?php while ( $row = pg_fetch_array ( $result ) ) { ?>
    <tr>
        <td><?php echo $row['client_id']; ?></td>
        <td><?php echo implode(',',json_decode($row['insurance'])); ?></td>
        <td><?php 
            $sRows = '';
            if($row['iCnt'] > 0) {
                $sRows = $row['iCnt']==1?' row':' rows';
            }                   
            echo ''.$row['iCnt'].$sRows;
        ?></td>
    </tr>
<?php } ?> 
</tbody>
</table>
</div>
</body>
</html>