如何将前几年的数据添加到这个 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
子句使用EntryDate
而select
使用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 行,Month
、Current Year
和 Previous Year
?以上是关于如何将前几年的数据添加到这个 SQL 查询中(也可以让它变得更简单)?的主要内容,如果未能解决你的问题,请参考以下文章