Mysql 超级复杂的SQL语句…可能不可能
我做过一些编程和SQL,但除了我自己的小项目外,我不是开发人员。 我现在有一个问题,我很想用纯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
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是非常不同的系统。删除不相关的标记这是我的问题简而言之,我可以创建一个语句来获取数据,而不使用递增的行程计数器,但不知道从何处开始获取总行程数据。非常感谢,可以。谢谢你,塞格,这非常快,离我能够获得的解决方案更近了。我已经测试过了,有两个问题。谢谢你,塞格,这是非常快的,非常接近解决方案,然后我能够得到。我已经测试过了,有两个问题。首先,计数从零开始,所以它基本上从第二个开始-结束组合开始计数。尝试只添加一个,但不能不添加到那些不包括家,这是一个小问题,我可以解决。更大的问题是,类似的开始-结束组合应该算作一个,例如,家->杂货店和杂货店->家应该算作相同的总数。另一个大问题是,杂货店每天只能在总数中计算一次。