【问题标题】:SQL sum of different status within 24 hrs group by hours24小时内不同状态的SQL总和按小时分组
【发布时间】:2015-09-16 20:01:03
【问题描述】:

我正在尝试按小时汇总 24 小时组内的状态。我有一个订单、订单状态和状态表。

订单表:

+---------+-------------------------+
| orderid | orderdate               |
+---------+-------------------------+
| 1       | 2015-09-16 00:04:19.100 |
| 2       | 2015-09-16 00:01:19.490 |
| 3       | 2015-09-16 00:02:33.733 |
| 4       | 2015-09-16 00:03:58.800 |
| 5       | 2015-09-16 00:01:16.020 |
| 6       | 2015-09-16 00:01:16.677 |
| 7       | 2015-09-16 00:02:06.920 |
+---------+-------------------------+

订单状态表:

+---------+----------+
| orderid | statusid |
+---------+----------+
| 1       | 11       | 
| 2       | 22       |
| 3       | 22       |
| 4       | 11       |
| 5       | 22       |
| 6       | 33       |
| 7       | 11       |
+---------+----------+

状态表:

+----------+----------+
| statusid | status   |
+----------+----------+
| 11       | PVC      |
| 22       | CCC      |
| 33       | WWW      |
|          |          |
+----------+----------+

我正在尝试编写 SQL 来显示按小时分组的不同 orderid 在 24 小时内的状态计数,如下所示:

+------+-----+-----+-----+
| Hour | PVC | CCC | WWW |
+------+-----+-----+-----+
| 1    | 0   | 2   | 1   |
| 2    | 1   | 1   | 0   |
| 3    | 1   | 0   | 0   |
| 4    | 1   | 0   | 0   |
+------+-----+-----+-----+

到目前为止,这是我的 SQL。我一直在尝试获取每个订单状态的总和:

SELECT
    DATEPART(hour, o.orderdate) AS Hour,
    SUM( 
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os  
            WHERE stat.status IN ('PVC') AND os.orderid = o.id AND os.statusid = stat.id
        ) 
            WHEN 'PVC' THEN 1 
            ELSE 0 
        END 
    ) AS PVC,
    SUM(
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os 
            WHERE stat.status IN ('WWW') AND os.orderid = o.id AND os.statusid = stat.id
        ) 
          WHEN 'CCC' THEN 1 
          ELSE 0 
        END 
    ) AS CCC,
    SUM( 
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os 
            WHERE stat.status IN ('CCC') AND os.orderid = o.id AND os.statusid = stat.id) 
            WHEN 'WWW' THEN 1 
            ELSE 0 
        END 
    ) AS WWW 
FROM orders o 
WHERE o.orderdate BETWEEN DATEADD(d,-1,CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP 
GROUP BY DATEPART(hour, o.orderdate) 
ORDER BY DATEPART(hour, o.orderdate);

【问题讨论】:

  • 您的状态表是否有错误...它有 11 3 次不同的值。
  • 我更正了。谢谢。

标签: sql count


【解决方案1】:

给你——我忽略了你数据中的错误,因为如果状态表真的有重复的 id,就像你的示例数据一样,这将失败。

SELECT hour, sum(PVC) as PVC, sum(CCC) as CCC, sum(WWW) as WWW
from (
  select datepart(hour,orderdate) as hour, 
        case when s.status = 'PVC' then 1 else 0 end as PVC,
        case when s.status = 'CCC' then 1 else 0 end as CCC,
        case when s.status = 'WWW' then 1 else 0 end as WWW
  from order o 
  join orderstatus os on o.orderid = os.orderid
  join status s on s.statusid = os.statusid
) sub
group by hour

【讨论】:

    【解决方案2】:

    这应该让你更接近,然后你必须转向:

    SELECT 
       DATEPART(HOUR,o.orderdate) AS orderDate_hour, 
       s.status,
       COUNT(DISTINCT o.orderid) AS count_orderID
     FROM  
         orders o INNER JOIN
         orderstatus os ON
         o.orderid = os.orderid INNER JOIN
         status s ON
         os.statusid = s.statusid
    WHERE 
        o.orderdate >= DATEADD(d,-1,CURRENT_TIMESTAMP)
    GROUP BY 
        DATEPART(HOUR,o.orderdate) , s.status
    ORDER BY 
        DATEPART(HOUR,o.orderdate)
    

    试试这个作为支点:

    SELECT 
        *
    FROM
        (SELECT 
           DATEPART(HOUR,o.orderdate) AS orderDate_hour, 
           s.status,
           COUNT(DISTINCT o.orderid) AS count_orderID
         FROM  
             orders o INNER JOIN
             orderstatus os ON
             o.orderid = os.orderid INNER JOIN
             status s ON
             os.statusid = s.statusid
        WHERE 
            o.orderdate >= DATEADD(d,-1,CURRENT_TIMESTAMP) 
        GROUP BY 
            DATEPART(HOUR,o.orderdate) , s.status) s
    PIVOT ( MAX(count_orderID) FOR status    IN ('pvc','ccc','www')) AS p
    ORDER BY 
        orderDate_hour 
    

    【讨论】:

    • 我会尝试并告诉你。非常感谢您的时间和考虑。
    • sql 没有运行。 status 是一个表名。您的意思是在 select 语句中将状态列为一列吗? SELECT DATEPART(HOUR,o.orderdate) 作为 HOUR, status, COUNT(DISTINCT o.orderid) FROM
    • 第一个sql?还是枢轴?它给你一个错误吗?
    • 是订单表日期中的字段名称,如您的示例,或 orderdate,如您的 SQL?
    • 订购日期不是日期。对于那个很抱歉。 sql 不只返回两个标题:小时和没有标题名称的另一列。应该有 4 列 Hour、PVC、CCC 和 WWW 填充 24 小时内不同行的状态总和...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多