Mysql 超级复杂的SQL语句…可能不可能

Mysql 超级复杂的SQL语句…可能不可能,mysql,sql,sqlite,Mysql,Sql,Sqlite,我做过一些编程和SQL,但除了我自己的小项目外,我不是开发人员。 我现在有一个问题,我很想用纯SQL来解决,但却不知道如何解决。 我有两个简单的表格,我需要从中绘制月度报告,但我需要做一些计算,这是棘手的部分。 这里是结构图 table km_locations columns location_id INT location_name TXT table km_trips colums trip_id INT trip_date DATE start_locat

我做过一些编程和SQL,但除了我自己的小项目外,我不是开发人员。 我现在有一个问题,我很想用纯SQL来解决,但却不知道如何解决。 我有两个简单的表格,我需要从中绘制月度报告,但我需要做一些计算,这是棘手的部分。 这里是结构图

table 
  km_locations
columns
  location_id INT
  location_name TXT

table
  km_trips
colums
  trip_id INT
  trip_date DATE
  start_location_id INT
  end_location_id INT
  km_start INT
  km_end INT
这些规则让我很难理解

在特定日期范围内创建报告,例如 2016-02-15和2016-03-15。 将开始位置id和结束位置id替换为相应的 位置名称,以公里为单位。 算一算过去12个月内我做过多少次类似的旅行 在单独的列中显示增量值。 仅计算从家出发或从家出发的行程,并且仅在当天没有其他具有相同起始和结束目的地组合的行程时计算。 下面的示例没有我可以通过此语句获得的总行程

SELECT
t.trip_date,
c1.location_name AS 'trip_start',
c2.location_name AS 'trip_end',
t.km_start,
t.km_end
FROM km_trips t
LEFT JOIN km_locations c1 ON c1.location_id = t.start_location_id
LEFT JOIN km_locations c2 ON c2.location_id = t.end_location_id
WHERE t.trip_date BETWEEN '2016-02-06' AND '2016-03-10'
ORDER BY t.trip_date ASC, t.km_start ASC 
想要样本日期输出

id     date     trip_start      trip_end        km_start    km_end  total_trips
1   2016-02-15  Home            Grocery Store   10675       10681   8
2   2016-02-15  Grocery Store   Gas Station     10681       10684
3   2016-02-15  Gas Station     Home            10684       10689   5
4   2016-02-16  Home            Grocery Store   10689       10695   9
5   2016-02-16  Grocery Store   Home            10695       10701
6   2016-02-17  Home            School          10701       10723   12
7   2016-02-17  School          Grocery Store   10723       10739
8   2016-02-17  Grocery Store   Friends House   10739       10755
9   2016-02-17  Friends House   Home            10755       10767   7
10  2016-02-18  Home            Friends House   10767       10783   8
11  2016-02-18  Friends House   Home            10755       10767
12  2016-02-19  Home            Friends House   10767       10783   9
13  2016-02-19  Friends House   Grocery Store   10783       10792
14  2016-02-19  Grocery Store   Home            10792       10798   10
对于SQL语句来说,这可能太多了,但我认为,通过视图、联合和som疯狂技巧,这是可能的。 这是一个新的项目,我从Excel移动,所以我愿意接受任何建议表结构,可以使这项工作。 现在我正试图用SQLite实现这一点,但如果这是我唯一的选择,我将使用另一个数据库


谢谢。

试试相关的子查询

SELECT
t.trip_date,
c1.location_name AS 'trip_start',
c2.location_name AS 'trip_end',
t.km_start,
t.km_end,
(SELECT count(DISTINCT t2.trip_date) cnt
 FROM km_trips t2
 WHERE t2.trip_date < t.trip_date
    AND  t2.start_location_id = t.start_location_id
    AND  t2.end_location_id = t.end_location_id
    AND (SELECT location_id FROM km_locations WHERE location_name = 'home') 
         IN (t2.start_location_id, t2.end_location_id)
 ) count
FROM km_trips t
LEFT JOIN km_locations c1 ON c1.location_id = t.start_location_id
LEFT JOIN km_locations c2 ON c2.location_id = t.end_location_id
WHERE t.trip_date BETWEEN '2016-02-06' AND '2016-03-10'
ORDER BY t.trip_date ASC, t.km_start ASC 

起始值和结束值仅在每次行程的基础上才有意义。总次数与每次旅行有什么关系?总次数应该是过去12个月内,我以家为起点或终点旅行的次数。出现了一些格式错误,因此在第4条规则中“隐藏”了细节。如果您能在SQL中表达这意味着什么,您将离解决此问题更近一步。您可能需要创建一个包含可以加入的行程计数的派生表。Mysql和sqlite是非常不同的系统。删除不相关的标记这是我的问题简而言之,我可以创建一个语句来获取数据,而不使用递增的行程计数器,但不知道从何处开始获取总行程数据。非常感谢,可以。谢谢你,塞格,这非常快,离我能够获得的解决方案更近了。我已经测试过了,有两个问题。谢谢你,塞格,这是非常快的,非常接近解决方案,然后我能够得到。我已经测试过了,有两个问题。首先,计数从零开始,所以它基本上从第二个开始-结束组合开始计数。尝试只添加一个,但不能不添加到那些不包括家,这是一个小问题,我可以解决。更大的问题是,类似的开始-结束组合应该算作一个,例如,家->杂货店和杂货店->家应该算作相同的总数。另一个大问题是,杂货店每天只能在总数中计算一次。