我正在尝试创建一个连接2个表的视图,但结果取决于查询。这是我想要实现的一个例子。
我有一个名为 sessionaccounting 的表格和一个名为 sessionaccountingdailysplit 的表格。
sessionaccounting 包含我们所有的会计数据, sessionaccountingdailysplit 是按日期拆分的会话记录数据。它们由外键 sessionaccountingid
连接在一起两个表如何协同工作如下:
表示sessionaccounting中的行:
starttime - '2012-01-01',endtime - '2012-01-03',usage - 10000
表示sessionaccountingdailysplit中的行:
日期 - '2012-01-01',用法 - 3000
日期 - '2012-01-02',用法 - 5000
日期 - '2012-01-03',用法 - 2000
现在我要做的是如果我将名为 vw_sessionaccounting 的视图作为
运行SELECT *
FROM vw_sessionaccounting
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';
它必须仅对 sessionaccountingdailysplit 中的前两个日期求和,并相应地替换每个受影响行的 sessionaccounting 中的用法。 (大多数情况下 sessionaccountingdailysplit 因为没有拆分而没有一行)
如上所述,如果我运行
SELECT *
FROM sessionaccounting
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';
我会得到
的结果starttime - '2012-01-01',endtime - '2012-01-03',usage - 10000
但如果我运行查询
SELECT *
FROM vw_sessionaccounting
WHERE starttime >= '2011-01-01'
AND starttime <= '2011-01-02';
我会得到
的结果starttime - '2012-01-01',endtime - '2012-01-03',usage - 8000
答案 0 :(得分:2)
你的问题在某些方面有点模糊。但是从我收集和猜测的结果来看,您的查询(视图)可能如下所示:
SELECT s.starttime
,s.endtime
,COALESCE(max(sd.date), s.endtime) AS effective_endtime_max_2_days
,COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days
FROM sessionaccounting s
LEFT JOIN sessionaccountingdailysplit sd USING (sessionaccountingid)
WHERE sd.sessionaccountingid IS NULL -- no split ..
OR (starttime + 2) > sd.date -- .. or only the first two days of the split
GROUP BY s.starttime,s.endtime
LEFT JOIN
因为:...大多数情况下sessionaccountingdailysplit没有一行,因为没有分裂
仅包含前两天:(starttime + 2) > sd.date
请确保包含没有吐出的会话:WHERE sd.sessionaccountingid IS NULL OR
使用表别名来解决您的怪异表名:
FROM sessionaccounting s
sum()
前两天的使用情况。如果没有吐,请改为使用原始总使用量:COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days