Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何组合具有不同where子句和按不同日期列分组的两个查询_Sql_Sql Server 2008 - Fatal编程技术网

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)这是正确的方法吗?