![](/img/trans.png)
[英]how to make a copy of a mysql table, adding some columns and taking some out, changing the order and retaining any data relevant to the new table?
[英]Mysql create a table out of some data
我有一个装满发票的数据库。 在今年年底,我想回顾一下这一年。 我希望评论看起来像这张照片:
这是我拥有的数据的一个示例...
这是我到目前为止所做的查询。 如果有人可以提供帮助,我将不胜感激。
SELECT invID, invDate, craftArr, vesselTotal, craftGT
FROM company, agents, vessels, invoice
WHERE invoice.status = '0'
AND invoice.craftArr > '2014-01-01'
AND invoice.craftArr < '2014-12-31'
AND invoice.invCraft = vessels.craftID
AND vessels.craftComp = company.compID
AND company.compAgent = agents.agentID
ORDER BY craftArr ASC
我会尽力告诉您如何实现目标。
遍历GT的范围:
1.1。 使用此查询收集给定范围内每个月的总计。 查询将为您提供当前行的金额列表。
注意。 您从PHP脚本传递了两个变量,用于GT范围的开始和结束。
SELECT MONTH(craftArr) as monthNumber, sum(vesselTotal) as total FROM company, agents, vessels, invoice WHERE invoice.status = '0' AND invoice.craftArr > '2014-01-01' AND invoice.craftArr < '2014-12-31' AND invoice.invCraft = vessels.craftID AND vessels.craftComp = company.compID AND company.compAgent = agents.agentID AND craftGT between ($START_CURRENT RANGE, $END_CURRENT_RANGE) group by MONTH(craftArr) ORDER BY monthNumber ASC
1.2。 将$ total变量设置为0。
1.3。 使用一个循环遍历月份和查询结果:
注意。 如果几个月没有发票,则无金额。 您需要在迭代时进行处理( monthNumber
可以用于此操作)。
1.3.1。 在适当的单元格中输出数量;如果本月没有结果,则输出为0。
1.3.2。 通过当前金额增加$ total
1.4。 当前行的输出总计
您只需要条件聚合。 首先要修复您的查询,以使用适当的联接。
这是它的外观示意图:
SELECT craftGT,
sum(case when month(craftArr) = 1 then vesselTotal else 0 end) as Jan,
sum(case when month(craftArr) = 2 then vesselTotal else 0 end) as Feb,
. . .
sum(case when month(craftArr) = 12 then vesselTotal else 0 end) as Dec,
sum(vesselTotal) as Total
FROM company join
agents
on company.compAgent = agents.agentID join
vessels
on vessels.craftComp = company.compID join
invoice
on invoice.invCraft = vessels.craftID
WHERE invoice.status = '0' AND
invoice.craftArr > '2014-01-01' AND
invoice.craftArr < '2014-12-31'
GROUP BY craftGT;
您似乎希望将craftGT
放在范围内。 目前尚不清楚细节是什么样的,但是您可以通过一个case
来做到这一点:
SELECT (case when CraftGT BETWEEN 0 and 1000 THEN '0-1000'
when CraftGT BETWEEN 1001 and 1999 THEN 1000-1999'
. . .
end) as craftGTRange
. . .
GROUP BY craftGTRange
从下面发布的示例中应该立即清楚两件事。 首先是PHP不是我的强项!! 第二个是,即使这样,构造所需的输出也非常容易! 这个概念可以扩展到数据网格之类的东西,从而带来更大的灵活性。
请注意,为了易于理解,我简化了“ GT括号”。
数据集...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(invID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,InvDate DATE NOT NULL
,craftArr DATETIME NOT NULL
,vesselTotal DECIMAL(6,2) NOT NULL
,craftGT INT NOT NULL
);
INSERT INTO my_table VALUES
(23 ,'2014-02-01','2014-01-31 23:10:00', 595.07, 13992),
(24 ,'2014-02-02','2014-02-02 03:20:00', 956.08, 33933),
(25 ,'2014-02-05','2014-02-05 00:00:00', 952.06, 52926),
(26 ,'2014-02-05','2014-02-05 00:35:00', 637.38, 30998),
(50 ,'2014-02-05','2014-02-05 01:00:00',1196.25, 42289),
(28 ,'2014-02-06','2014-02-06 00:40:00', 480.64, 24344),
(30 ,'2014-02-06','2014-02-06 15:10:00', 246.7 , 8500),
(31 ,'2014-02-07','2014-02-06 23:30:00',2082.69, 71304),
(34 ,'2014-02-07','2014-02-07 00:10:00',1429.2 , 77499),
(32 ,'2014-02-07','2014-02-07 00:40:00', 557.34, 26302);
SELECT * FROM my_table;
+-------+------------+---------------------+-------------+---------+
| invID | InvDate | craftArr | vesselTotal | craftGT |
+-------+------------+---------------------+-------------+---------+
| 23 | 2014-02-01 | 2014-01-31 23:10:00 | 595.07 | 13992 |
| 24 | 2014-02-02 | 2014-02-02 03:20:00 | 956.08 | 33933 |
| 25 | 2014-02-05 | 2014-02-05 00:00:00 | 952.06 | 52926 |
| 26 | 2014-02-05 | 2014-02-05 00:35:00 | 637.38 | 30998 |
| 28 | 2014-02-06 | 2014-02-06 00:40:00 | 480.64 | 24344 |
| 30 | 2014-02-06 | 2014-02-06 15:10:00 | 246.70 | 8500 |
| 31 | 2014-02-07 | 2014-02-06 23:30:00 | 2082.69 | 71304 |
| 32 | 2014-02-07 | 2014-02-07 00:40:00 | 557.34 | 26302 |
| 34 | 2014-02-07 | 2014-02-07 00:10:00 | 1429.20 | 77499 |
| 50 | 2014-02-05 | 2014-02-05 01:00:00 | 1196.25 | 42289 |
+-------+------------+---------------------+-------------+---------+
10 rows in set (0.00 sec)
SELECT FLOOR(craftgt/1000)*1000 GT
, MONTH(craftarr) month
, SUM(vesseltotal) income
FROM my_table
WHERE craftarr BETWEEN '2014-01-01' AND '2015-01-01'
GROUP
BY FLOOR(craftgt/1000)*1000
, MONTH(craftarr);
+-------+-------+---------+
| GT | month | income |
+-------+-------+---------+
| 8000 | 2 | 246.70 |
| 13000 | 1 | 595.07 |
| 24000 | 2 | 480.64 |
| 26000 | 2 | 557.34 |
| 30000 | 2 | 637.38 |
| 33000 | 2 | 956.08 |
| 42000 | 2 | 1196.25 |
| 52000 | 2 | 952.06 |
| 71000 | 2 | 2082.69 |
| 77000 | 2 | 1429.20 |
+-------+-------+---------+
PHP的...
<?php
include('path/to/connection/scr.ipt');
$query = "
SELECT FLOOR(craftgt/1000)*1000 GT
, MONTH(craftarr) month
, SUM(vesseltotal) income
FROM my_table
WHERE craftarr BETWEEN '2014-01-01' AND '2015-01-01'
GROUP
BY FLOOR(craftgt/1000)*1000
, MONTH(craftarr);
";
?>
<table>
<tr>
<td>GT</td>
<td>Jan</td>
<td>Feb</td>
<td>Mar</td>
<td>Apr</td>
<td>May</td>
<td>Jun</td> <!--This bit could have been automated too -->
<td>Jul</td>
<td>Aug</td>
<td>Sep</td>
<td>Oct</td>
<td>Nov</td>
<td>Dec</td>
<td>Total</td>
</tr>
<?
$result = mysqli_query($conn,$query);
while($row = mysqli_fetch_assoc($result)){
$output = '';
$total = 0;
for($i=1;$i<=12;$i++){
if($row['month'] == $i){ $income = $row['income'] ;} else { $income = 0; }
$total += $income;
$output .= "<td>$income</td>";
}
echo "<tr><td>".$row['GT']."</td>".$output."<td>$total</td></tr>";
}
?>
</tr>
</table>
输出:
GT Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Total
8000 0 246.70 0 0 0 0 0 0 0 0 0 0 246.7
13000 595.07 0 0 0 0 0 0 0 0 0 0 0 595.07
24000 0 480.64 0 0 0 0 0 0 0 0 0 0 480.64
26000 0 557.34 0 0 0 0 0 0 0 0 0 0 557.34
30000 0 637.38 0 0 0 0 0 0 0 0 0 0 637.38
33000 0 956.08 0 0 0 0 0 0 0 0 0 0 956.08
42000 0 1196.25 0 0 0 0 0 0 0 0 0 0 1196.25
52000 0 952.06 0 0 0 0 0 0 0 0 0 0 952.06
71000 0 2082.69 0 0 0 0 0 0 0 0 0 0 2082.69
77000 0 1429.20 0 0 0 0 0 0 0 0 0 0 1429.2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.