Sql 使用不同的where子句条件组合查询

Sql 使用不同的where子句条件组合查询,sql,Sql,如何组合这些查询,以便使用第一个查询中第二个查询的dayCall 第一次查询 select clientid, DATEDIFF( DAY, CONVERT(datetime, convert(varchar(10), min(calendar))), MIN(dayCall) ) from Stats group by clientid SELECT clientid, MIN(calenda

如何组合这些查询,以便使用第一个查询中第二个查询的
dayCall

第一次查询

select clientid, 
DATEDIFF(
        DAY,
        CONVERT(datetime, convert(varchar(10), min(calendar))),
        MIN(dayCall)     
        )
from
Stats 
group by clientid
SELECT  
    clientid, 
    MIN(calendar)    
    as dayCall
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar,
        lead(calls) over (partition by clientid order by calendar) as total_1,
        lead(calls, 2) over (partition by clientid order by calendar) as total_2
    FROM STATS

) a
where calls = 0 and total_1 = 0 and total_2 = 0
GROUP BY clientid
第二次查询

select clientid, 
DATEDIFF(
        DAY,
        CONVERT(datetime, convert(varchar(10), min(calendar))),
        MIN(dayCall)     
        )
from
Stats 
group by clientid
SELECT  
    clientid, 
    MIN(calendar)    
    as dayCall
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar,
        lead(calls) over (partition by clientid order by calendar) as total_1,
        lead(calls, 2) over (partition by clientid order by calendar) as total_2
    FROM STATS

) a
where calls = 0 and total_1 = 0 and total_2 = 0
GROUP BY clientid

你可以把这些表连在一起。我看到clientID在这两个表中都很常见,但应该进行完全外部联接,以确保即使两个表之间没有公共clientID,也能得到所有结果:

SELECT * FROM 
(
select clientid, 
DATEDIFF(
        DAY,
        CONVERT(datetime, convert(varchar(10), min(calendar))),
        MIN(dayCall)     
        )
from
Stats 
group by clientid
) tableA
FULL OUTER JOIN 
(
SELECT  
    clientid, 
    MIN(calendar)    
    as dayCall
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar,
        lead(calls) over (partition by clientid order by calendar) as total_1,
        lead(calls, 2) over (partition by clientid order by calendar) as total_2
    FROM STATS

) a
where calls = 0 and total_1 = 0 and total_2 = 0
GROUP BY clientid
) tableB
ON tableA.clientid = tableB.clientid

你可以把这些表连在一起。我看到clientID在这两个表中都很常见,但应该进行完全外部联接,以确保即使两个表之间没有公共clientID,也能得到所有结果:

SELECT * FROM 
(
select clientid, 
DATEDIFF(
        DAY,
        CONVERT(datetime, convert(varchar(10), min(calendar))),
        MIN(dayCall)     
        )
from
Stats 
group by clientid
) tableA
FULL OUTER JOIN 
(
SELECT  
    clientid, 
    MIN(calendar)    
    as dayCall
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar,
        lead(calls) over (partition by clientid order by calendar) as total_1,
        lead(calls, 2) over (partition by clientid order by calendar) as total_2
    FROM STATS

) a
where calls = 0 and total_1 = 0 and total_2 = 0
GROUP BY clientid
) tableB
ON tableA.clientid = tableB.clientid

使用条件聚合:

select clientid, 
       min(case when calls = 0 and total_1 = 0 and total_2 = 0 then calendar end) as dayCall,
       datediff(day
                convert(datetime, convert(varchar(10), min(calendar))),
                min(dayCall)     
               )
from (select s.*, 
             convert(datetime, convert(varchar(10), calendar)) calendar,
                     lead(calls) over (partition by clientid order by calendar) as total_1,
                     lead(calls, 2) over (partition by clientid order by calendar) as total_2
      from STATS s
     ) s
group by clientid

使用条件聚合:

select clientid, 
       min(case when calls = 0 and total_1 = 0 and total_2 = 0 then calendar end) as dayCall,
       datediff(day
                convert(datetime, convert(varchar(10), min(calendar))),
                min(dayCall)     
               )
from (select s.*, 
             convert(datetime, convert(varchar(10), calendar)) calendar,
                     lead(calls) over (partition by clientid order by calendar) as total_1,
                     lead(calls, 2) over (partition by clientid order by calendar) as total_2
      from STATS s
     ) s
group by clientid

对你的大多数读者来说,这可能是苹果对橙子。最好在这里包含一些示例数据以及预期的输出。第二个查询无效。应引发错误。请使用CTE(公共表表达式)计算第二个查询,然后在第一个查询中使用它。对于大多数读者来说,这可能是小菜一碟。最好在这里包含一些示例数据以及预期的输出。第二个查询无效。应引发错误。使用CTE(公共表表达式)计算第二个查询,然后在第一个查询中使用它。当尝试执行
MIN(dayCall)
时,我收到
无效列名dayCall
错误。原始查询可能有问题。我所做的只是按照请求将这两个查询连接在一起。我没有测试您的原始查询。我在尝试执行
MIN(dayCall)
时遇到
无效列名dayCall
错误。您的原始查询可能有问题。我所做的只是按照请求将这两个查询连接在一起。我没有测试您的原始查询。我在尝试执行
MIN(dayCall)
@Aaron时遇到
无效列名dayCall
错误
DayCall
在您的第一个查询中。这不是我发明的。我编辑了答案,从
STATS
中选取了所有栏目。戈登,我想我之前不清楚。此行抛出错误-
datediff(day convert(日期时间,convert(varchar(10),min(日历))),min(dayCall))
。它无法从脚本的第二行识别
dayCall
。当它尝试执行
MIN(dayCall)
@Aaron时,我得到一个
无效的列名dayCall
错误
DayCall
在您的第一个查询中。这不是我发明的。我编辑了答案,从
STATS
中选取了所有栏目。戈登,我想我之前不清楚。此行抛出错误-
datediff(day convert(日期时间,convert(varchar(10),min(日历))),min(dayCall))
。它无法从脚本的第二行识别
dayCall