Sql 如何组合具有不同where子句和按不同日期列分组的两个查询
在很多方面都尝试过,但最终都会出错。 我有以下两个问题:Sql 如何组合具有不同where子句和按不同日期列分组的两个查询,sql,sql-server-2008,Sql,Sql Server 2008,在很多方面都尝试过,但最终都会出错。 我有以下两个问题: SELECT EnqDate AS Date, COUNT(ID) AS EnqueryCount FROM Enquiry WHERE EnqDate BETWEEN 'June 24 2017' AND 'June 29 2017' GROUP BY EnqDate order by Date SELECT FirstTryDateTime AS Date, COUNT(ID) AS FirstCallCount FROM E
SELECT EnqDate AS Date, COUNT(ID) AS EnqueryCount
FROM Enquiry
WHERE EnqDate BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY EnqDate
order by Date
SELECT FirstTryDateTime AS Date, COUNT(ID) AS FirstCallCount
FROM Enquiry
WHERE FirstTryDateTime BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY FirstTryDateTime
order by Date
结果如下:
我需要将这两个查询结合起来,并要求得到如下结果:
SELECT EnqDate AS Date, COUNT(ID) AS EnqueryCount
FROM Enquiry
WHERE EnqDate BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY EnqDate
order by Date
SELECT FirstTryDateTime AS Date, COUNT(ID) AS FirstCallCount
FROM Enquiry
WHERE FirstTryDateTime BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY FirstTryDateTime
order by Date
有人能帮我吗?我只想通过列日期将两个查询结果连接起来:
SELECT A.Date
,A.EnqueryCount
,B.FirstCallCount
FROM
(
SELECT EnqDate AS Date, COUNT(ID) AS EnqueryCount
FROM Enquiry
WHERE EnqDate BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY EnqDate
order by Date
) A
LEFT JOIN
(
SELECT FirstTryDateTime AS Date, COUNT(ID) AS FirstCallCount
FROM Enquiry
WHERE FirstTryDateTime BETWEEN 'June 24 2017' AND 'June 29 2017'
GROUP BY FirstTryDateTime
order by Date
) B
ON A.Date = B.Date
请注意,您应该尽量避免使用Oracle保留字(即日期)作为列名。您可以使用取消填充表,然后应用条件聚合以获得所需的结果:
SELECT Val,
COUNT(CASE WHEN DateField = 'EnqDate' THEN ID END) AS EnqueryCount,
COUNT(CASE WHEN DateField = 'FirstTryDateTime' THEN ID END) AS FirstCallCount
FROM (
SELECT ID, EnqDate, FirstTryDateTime
FROM Enquiry
WHERE (EnqDate BETWEEN '2017-06-24' AND '2017-06-29') OR
(FirstTryDateTime BETWEEN '2017-06-24' AND '2017-06-29')) AS p
UNPIVOT (Val FOR DateField IN ( EnqDate, FirstTryDateTime)) AS unpvt
GROUP BY Val
ORDER BY Val
只需像这样组合
Union All
,Sum()
和子查询
SELECT Sel.Date, sum(EnqueryCount) as EnqueryCount, sum(FirstCallCount) as FirstCallCount
FROM
(SELECT EnqDate AS Date, 1 AS EnqueryCount, 0 AS FirstCallCount
FROM Enquiry
WHERE EnqDate BETWEEN 'June 24 2017' AND 'June 29 2017'
union all
SELECT FirstTryDateTime AS Date, 0 AS EnqueryCount, 1 AS FirstCallCount
FROM Enquiry
WHERE FirstTryDateTime BETWEEN 'June 24 2017' AND 'June 29 2017') Sel
group by Sel.Date
order by Sel.Date
您还可以提供生成您在帖子中提到的结果的输入数据吗?@HoneyBadger的可能副本此案例尝试将具有不同
分组依据字段的查询组合起来。@Giorgosbetos,是吗?原理是一样的,没错,乔治。我试着先搜索。然后贴出问题。这个案例不同。左连接?若查询右侧有结果,但左侧并没有,则结果将不正确have@Vecchiasignora:嗯,这只是基于问题中公布的数据。这完全取决于数据。因此,完全连接可能更好way@Sindhoor:您能解释一下,为什么它不起作用吗?我会从一个日历表开始,以确保选择了所有日期。因为问题是,MS SQL Server,Oracle保留字不会伤害他。但无论如何,他应该避免在一般情况下使用保留词是的。我从下一步开始遵循您的指导。这部分工作正常,但没有给出总计数,因为它需要日期和时间。@Sindhoor这不是一个与OP问题直接相关的问题。您只需将DATETIME
字段转换为date
类型即可解决此问题。是的,但这样做会出错。我正在尝试转换(VARCHAR(11),EnqDate)这是正确的方法吗?