Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 计数为2,因为1/20超出了1/1的30天期限。如果有另一行('Cust3'、'100'、'2/27/13'),则不应计算该行,因为它是在2/10之后的30天内。如果有另一行('Cust3'、'100'、'3/15/13'),那么这将被计算,因为这是2/1_Sql_Sql Server 2008 R2 - Fatal编程技术网

Sql 计数为2,因为1/20超出了1/1的30天期限。如果有另一行('Cust3'、'100'、'2/27/13'),则不应计算该行,因为它是在2/10之后的30天内。如果有另一行('Cust3'、'100'、'3/15/13'),那么这将被计算,因为这是2/1

Sql 计数为2,因为1/20超出了1/1的30天期限。如果有另一行('Cust3'、'100'、'2/27/13'),则不应计算该行,因为它是在2/10之后的30天内。如果有另一行('Cust3'、'100'、'3/15/13'),那么这将被计算,因为这是2/1,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,计数为2,因为1/20超出了1/1的30天期限。如果有另一行('Cust3'、'100'、'2/27/13'),则不应计算该行,因为它是在2/10之后的30天内。如果有另一行('Cust3'、'100'、'3/15/13'),那么这将被计算,因为这是2/10之后的30天。有人能告诉我如何编码吗?但这一个返回了CustId 1的计数为2。对不起,这没用。也许我当时误解了。我以为你想统计那些在30天内多次接受调查的人。CustID 1在30天内进行了两次调查——一次在5/6,一次在5/13。Cust


计数为2,因为1/20超出了1/1的30天期限。如果有另一行('Cust3'、'100'、'2/27/13'),则不应计算该行,因为它是在2/10之后的30天内。如果有另一行('Cust3'、'100'、'3/15/13'),那么这将被计算,因为这是2/10之后的30天。有人能告诉我如何编码吗?但这一个返回了CustId 1的计数为2。对不起,这没用。也许我当时误解了。我以为你想统计那些在30天内多次接受调查的人。CustID 1在30天内进行了两次调查——一次在5/6,一次在5/13。CustID 2在30天内没有进行过多次调查,因此我排除了该ID。即使我误解了您的意图,您也应该能够非常轻松地将其调整为您需要的内容。它为您提供了一个自动的、滚动的30天周期,并以您喜欢的任何方式进行过滤。不管怎样,如果你得到了一个你满意的解决方案,干杯。谢谢,我想这就是问题所在“tetch”试图在下面编写代码。我必须在这之后再做一步——计算他发布的结果集中的行数。我是一名中级sql程序员,这对我来说相当复杂。我很欣赏你提到的其他选项,但它们不在我的范围之内,因为数据来自整个组织的各种大数据存储。因此,不能接触源数据库或输入系统。谢谢,您的代码返回了我所期望的一些测试数据。我必须做一个表格,接收所有的回答,并尝试这个-逻辑实际上太复杂(至少对我来说,我认为自己中等水平),因为我必须计算一个响应/每个调查/每个客户/每个组/每30天!这是大型报告代码的一部分,用户可以选择日期范围,如果他们选择YTD,那么我必须确保这不会导致性能问题。 create table #Something ( CustID Char(10), SurveyId char(5), ResponseDate datetime ) insert #Something select 'Cust1', '100', '5/6/13' union all select 'Cust1', '100', '5/13/13' union all select 'Cust2', '100', '4/20/13' union all select 'Cust2', '100', '5/22/13' select distinct custid, SurveyId, Count(custid) as CountResponse from #Something group by CustID, SurveyId CustomerID SurveyId CountResponse Cust1 100 1 Cust2 100 2
SELECT custid, surveyid
FROM Something a
WHERE NOT EXISTS (
    SELECT 1
    FROM Something b
    WHERE a.custid = b.custid
    AND a.surveyid = b.surveyid
    AND b.responseDate between a.responseDate AND a.responseDate - 30
    );    
-- Count of times custID returned surveyID, not counting same
-- survey within 30 day period.
SELECT custid, surveyid, count(*) countResponse
FROM Something a
WHERE NOT EXISTS (
    SELECT 1
    FROM Something b
    WHERE a.custid = b.custid
    AND a.surveyid = b.surveyid
    AND b.responseDate between a.responseDate AND a.responseDate - 30
    )
GROUP BY custid, surveyid
SELECT     CustID, SurveyID, COUNT(*) AS CountResponse
FROM         #SurveysTaken
WHERE     (NOT EXISTS
                      (SELECT     1
                        FROM          #SurveysTaken AS PriorSurveys
                        WHERE      (CustID = #SurveysTaken.CustID)
                               AND (SurveyId = #SurveysTaken.SurveyId)
                               AND (ResponseDate >= DATEADD(d, - 30, #SurveysTaken.ResponseDate))
                               AND (ResponseDate < #SurveysTaken.ResponseDate)))
GROUP BY CustID, SurveyID
SELECT     CustID, SurveyID, COUNT(*) AS CountResponse
FROM         (SELECT DISTINCT CustID, SurveyID, YEAR(ResponseDate) AS RepsonseYear,
                              DATEPART(DAYOFYEAR, ResponseDate) / 30 AS ThirtyDayPeriod
              FROM          #SurveysTaken) AS SurveysByPeriod
GROUP BY CustID, SurveyID
SELECT     CustID, SurveyID, COUNT(*) AS CountResponse
FROM         (SELECT DISTINCT CustID, SurveyID, YEAR(ResponseDate) AS ResponseYear,
                              MONTH(ResponseDate) AS ResponseMonth
              FROM          #SurveysTaken) AS SurveysByMonth
GROUP BY CustID, SurveyID
SELECT     CustID, SurveyID, COUNT(*) AS CountResponse
FROM         (SELECT DISTINCT CustID, SurveyID, DATEDIFF(D, '1/1/2013', ResponseDate) / 30 AS ThirtyDayPeriod
                       FROM          #SurveysTaken) AS SurveysByPeriod
GROUP BY CustID, SurveyID
SELECT     CustID, SurveyID, COUNT(*) AS CountResponse
FROM         (SELECT DISTINCT CustID, SurveyID, DATEDIFF(DAY,
                                                  (SELECT     MIN(ResponseDate)
                                                    FROM          #SurveysTaken AS FirstSurvey
                                                    WHERE      (CustID = #SurveysTaken.CustID)
                                                           AND (SurveyId = #SurveysTaken.SurveyId)), ResponseDate) / 30 AS ThirtyDayPeriod
                       FROM          #SurveysTaken) AS SurveysByPeriod
GROUP BY CustID, SurveyID
SELECT s.CustID, COUNT(s.SurveyID) AS SurveyCount
FROM #something s
INNER JOIN (SELECT CustID, SurveyId, ResponseDate
            FROM (SELECT #Something.*,
            ROW_NUMBER() OVER (PARTITION BY custid ORDER BY ResponseDate ASC) AS RN
            FROM #something) AS t
            WHERE RN = 1 ) f ON s.CustID = f.CustID
WHERE s.ResponseDate BETWEEN f.ResponseDate AND f.ResponseDate+30
GROUP BY s.CustID
HAVING COUNT(s.SurveyID) > 1
insert #Something values
('Cust3', '100', '1/1/13'),
('Cust3', '100', '1/20/13'),
('Cust3', '100', '2/10/13')
declare @Something table
(
    CustID Char(10),
    SurveyId char(5),
    ResponseDate datetime
)

insert @Something
select 'Cust1', '100', '5/6/13' union all
select 'Cust1', '100', '5/13/13' union all
select 'Cust1', '100', '7/13/13' union all
select 'Cust2', '100', '4/20/13' union all
select 'Cust2', '100', '5/22/13' union all
select 'Cust2', '100', '7/20/13' union all
select 'Cust2', '100', '7/24/13' union all
select 'Cust2', '100', '9/28/13' 

--SELECT CustID,SurveyId,COUNT(*) FROM (

select a.CustID,a.SurveyId,b.ResponseStart,--CONVERT(int,a.ResponseDate-b.ResponseStart),
CASE 
    WHEN CONVERT(int,a.ResponseDate-b.ResponseStart) > 30 
    THEN ((CONVERT(int,a.ResponseDate-b.ResponseStart))-(CONVERT(int,a.ResponseDate-b.ResponseStart) % 30))/30+1
    ELSE 1
END CustomPeriod -- defines periods 30 days out from first entry of survey
from @Something a
inner join
(select CustID,SurveyId,MIN(ResponseDate) ResponseStart
from @Something
group by CustID,SurveyId) b
on a.SurveyId=b.SurveyId
and a.CustID=b.CustID
group by a.CustID,a.SurveyId,b.ResponseStart,
CASE 
    WHEN CONVERT(int,a.ResponseDate-b.ResponseStart) > 30 
    THEN ((CONVERT(int,a.ResponseDate-b.ResponseStart))-(CONVERT(int,a.ResponseDate-b.ResponseStart) % 30))/30+1
    ELSE 1
END

--) x GROUP BY CustID,SurveyId