如何使用 SQL 在一行中组合不同的计数器

How to combine different counters in one line with SQL

我有一个 mysql table,其中包含关于有多少人成功登录以及多少人没有登录的信息。

接下来的 SQL 查询给出了正确的值,但不是最佳方式。

SELECT  Year(Time), 
  Month(Time), 
  DayOfMonth(Time),
  AccessType,
  Success,
  count(*) as Counter
FROM cas2015.TransactionLog 
WHERE AccessType = 1
GROUP BY  Year(Time), 
  Month(Time), 
  DayOfMonth(Time),  
  AccessType,
  Success
ORDER BY Time ASC;

结果是 table

<table border="1">
  <tr BGCOLOR="#CCCCFF">
    <th>Year(Time)</th>
    <th>Month(Time)</th>
    <th>DayOfMonth(Time)</th>
    <th>AccessType</th>
    <th>Success</th>
    <th>Counter</th>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>15</td>
    <td>1</td>
    <td>true</td>
    <td>29624</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>15</td>
    <td>1</td>
    <td>false</td>
    <td>4449</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>16</td>
    <td>1</td>
    <td>true</td>
    <td>26339</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>16</td>
    <td>1</td>
    <td>false</td>
    <td>4069</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>17</td>
    <td>1</td>
    <td>true</td>
    <td>15732</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>17</td>
    <td>1</td>
    <td>false</td>
    <td>2508</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>18</td>
    <td>1</td>
    <td>true</td>
    <td>16475</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>18</td>
    <td>1</td>
    <td>false</td>
    <td>3138</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>19</td>
    <td>1</td>
    <td>true</td>
    <td>29701</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>19</td>
    <td>1</td>
    <td>false</td>
    <td>4785</td>
  </tr>
</table>

在一行中将正值和负值并排放置会更有帮助。理想情况下,我可以有第三列,其中积极因素被消极因素所淹没。

这有可能吗?

<table border="1">
  <tr BGCOLOR="#CCCCFF">
    <th>Year(Time)</th>
    <th>Month(Time)</th>
    <th>DayOfMonth(Time)</th>
    <th>Positive</th>
    <th>Negative</th>
    <th>Aggregated</th>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>15</td>
    <td>29624</td>
    <td>4449</td>
    <td>6,6</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>15</td>
    <td>26339</td>
    <td>4069</td>
    <td>6,47</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>16</td>
    <td>15732</td>
    <td>2508</td>
    <td>6,27</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>16</td>
    <td>16475</td>
    <td>3138</td>
    <td>5,25</td>
  </tr>
  <tr>
    <td>2015</td>
    <td>10</td>
    <td>17</td>
    <td>29701</td>
    <td>4785</td>
    <td>6,21</td>
  </tr>
</table>

感谢您的提示

您需要一个条件聚合(所有 DBMS 都支持):

select dt.*,
   100 * FailCounter/SuccessCounter as FailedPercentage
from
 (   
   SELECT   Year(Time), 
        Month(Time), 
        DayOfMonth(Time),
        AccessType,
        SUM(case when Success = 'true'  then 1 else 0 end) as SuccessCounter,
        SUM(case when Success = 'false' then 1 else 0 end) as FailCounter,
   FROM cas2015.TransactionLog 
   WHERE AccessType = 1
   GROUP BY     Year(Time), 
        Month(Time), 
        DayOfMonth(Time),  
        AccessType
 ) as dt
ORDER BY 1,2,3;