我正在尝试创建一个用于报告目的的查询,当我尝试从多个连接(选择)中选择日期(第二列)时,我失败了。
查询是这样的:
SELECT a.Name, COALESCE(a.CustomerFaxes,0) AS 'CustomerFaxes', COALESCE(b.PoliceFaxes,0) AS 'PoliceFaxes', COALESCE(c.CustomerWebposts,0)AS 'CustomerWebposts', COALESCE(d.PoliceWebposts,0) AS 'PoliceWebposts', COALESCE(e.Letters,0) AS 'Letters'
FROM jobs j
LEFT JOIN (SELECT ...
GROUP BY 1,2) a ON ...
LEFT JOIN (SELECT ...
GROUP BY 1,2) b ON ...
LEFT JOIN (SELECT ...
GROUP BY 1,2) c ON ...
LEFT JOIN (SELECT ...
GROUP BY 1,2) d ON ...
LEFT JOIN (SELECT ...
GROUP BY 1,2) e ON ..
JOIN table cu ON ...
JOIN table2 a ON ...
WHERE j.UserID IN (1,2,3,4,5,6,7,8,9)
AND j.receivedontime BETWEEN UNIX_TIMESTAMP (20150302) AND UNIX_TIMESTAMP (20150310)
GROUP BY 1;
这会产生类似
的内容用户CustomerFaxes PoliceFaxes CustomerWebposts PoliceWebposts Letters
介于两者之间。所有子查询都将第二个值作为日期,我想选择它并按其分组。 你们中的任何人都知道吗?
答案 0 :(得分:1)
一些事情
首先,这会让你头疼
COALESCE(a.value2,0) AS 'value2', COALESCE(b.value2,0) AS 'value2'
您试图在同一结果集中为同一名称提供两个不同的列。
根据您的评论,听起来您真正想要的是将所有日期值放在一列中,使用第一个中的日期字段,然后是b,然后是c。您可以通过将它们全部插入到单个合并语句中来完成此操作。
COALESCE(a.date,b.date,c.date) as Date
其次,你应该知道列顺序在SQL中并不是特别重要。您永远不会按列号选择列。使用idex命名列是令人困惑的(如果有人重新排序您的查询会怎么样?)并且不会帮助其他用户弄清楚您的查询尝试做什么。从长远来看,可读性比什么都重要。你不想在6个月后回来,想知道你的查询应该做些什么。
第三,不要使用日期作为列名。在大多数SQL实现中,Date是一个重新分类的关键字。使用更具信息性的名称,例如' DateRecieved'或者' DateOpened'或者' DateOfBirth'或者' TheDateTheEarthStoodStill'。
答案 1 :(得分:0)
只使用列名而不是数字,然后从相关子查询中选择它 - 它就像那样简单。
例如 -
SELECT c.Date AS Date
或
SELECT d.Date AS Date
无论你想要Date的哪个子查询,只需使用它。