如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?

Posted

技术标签:

【中文标题】如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?【英文标题】:How can I add previous years data to this SQL query (also can it be made simpler at all)? 【发布时间】:2014-09-08 11:58:49 【问题描述】:

我已经开始使用 Highcharts 并提出以下 SQL 查询来将数据放在图表上。

它显示了客户在本年度每月下达的订单数量。

SELECT    TO_CHAR(TRUNC(Orders.OrdDate,'MM'),'Month'), COUNT(Orders.OrdNo)
FROM      Orders
WHERE     Orders.CusNo = '" . $_SESSION['customer'] . "'
AND       Orders.EntryDate LIKE '%-14'
GROUP BY  TO_CHAR(TRUNC(Orders.EntryDate,'MM'),'Month')

问题

    这个 SQL 查询非常混乱,能不能再简单一点?

    如何将前几年的数据添加到同一个 SQL 查询中?

目前我在 Highcharts 中使用这样的结果:

oci_execute($result);

      while ($row = oci_fetch_array($result)) 
         $data0[] = $row['0'];
         $data1[] = $row['1'];
      

      ...

      xAxis: 
          categories: ["<?php echo join($data0, '","') ?>"]
      ,

      series: [
         name: 'Current Year',
         color: '#2196f3',
         data: [<?php echo join($data1, ',') ?>]
      ],

理想情况下:

$data0 将是月份,例如一月。

$data1 将是当年​​该月的订单数。

$data2 将是上一年该月的订单数。

我只是不知道如何在单个 SQL 查询中执行此操作。

我正在使用 Oracle 8i。

提前致谢。

【问题讨论】:

【参考方案1】:

我会使用表别名编写查询:

SELECT TO_CHAR(TRUNC(o.OrdDate, 'MM'), 'Month'), COUNT(o.OrdNo)
FROM Orders o
WHERE o.CusNo = '" . $_SESSION['customer'] . "' AND o.EntryDate LIKE '%-14'
GROUP BY  TO_CHAR(TRUNC(o.EntryDate, 'MM'), 'Month');

我有点担心where 子句使用EntryDateselect 使用OrdDate。不过,让我假设这是故意的。如果您希望在两年内按月计算,我会使用数字月份格式而不是名称,并在 where 子句中修复日期比较:

SELECT TO_CHAR(o.OrdDate, 'YYYY-MM'), COUNT(o.OrdNo)
FROM Orders o
WHERE o.CusNo = '" . $_SESSION['customer'] . "' AND
      EXTRACT(year FROM EntryDate) IN (2014, 2013)
GROUP BY TO_CHAR(o.OrdDate, 'YYYY-MM');

请注意,在使用to_char() 之前,您不需要截断日期。

编辑:

如果您想要多列,只需使用条件聚合。不过,我仍然会在几个月内坚持使用数字:

SELECT TO_CHAR(o.OrdDate, 'MM'),
       SUM(case when EXTRACT(year FROM EntryDate) = 2013 then 1 else 0 end) as val_2013,
       SUM(case when EXTRACT(year FROM EntryDate) = 2014 then 1 else 0 end) as val_2014
FROM Orders o
WHERE o.CusNo = '" . $_SESSION['customer'] . "' AND
      EXTRACT(year FROM EntryDate) IN (2014, 2013)
GROUP BY TO_CHAR(o.OrdDate, 'MM');

【讨论】:

嗨。感谢你的回答。这个想法是 X 轴将包含 January 等。然后我可以让 $data1 是当年该月的订单数,$data2 是前一个月该月的订单数年。我认为您的回答会导致沿 X 轴重复月份。不能通过 SQL 返回 3 行,MonthCurrent YearPrevious Year

以上是关于如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?的主要内容,如果未能解决你的问题,请参考以下文章

SQL QUERY - 从头开始​​过滤日期

sql查询将前一个值添加到下一个值[重复]

显示前几年的年初至今销售额

连续几年出现的SQL查询数据

SQL如何查询表中某一列中的数据的前几位

前几年的互联网人vs现在的互联网人