고객이 하루에 여러 번 방문했는지 확인하기 위해 데이터베이스를 검사하는 쿼리가 있습니다. 그들이 가지고있는 경우 방문 횟수를 계산 한 다음 그들이 방문한 시간을 알려줍니다. 문제는 "Tickets.lcustomerid"를 group by 절에 던져서 5 개의 레코드 (바코드가없는 Customers)를 놓친다는 것입니다. 그룹 by 절에서 "tickets.lcustomerid"를 제거하기 위해 아래의 쿼리를 어떻게 바꿀 수 있습니까? 제거하면 집계의 일부가 아니기 때문에 "Tickets.lCustomerID"가 유효한 선택이 아닙니다. groupby 절. 작동그룹화 된 쿼리 열로
쿼리는 : 출력은
SELECT Customers.sBarcode, CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME) AS dtCreatedDate, COUNT(Customers.sBarcode) AS [Number of Scans],
MAX(Customers.sLastName) AS LastName
FROM Tickets INNER JOIN
Customers ON Tickets.lCustomerID = Customers.lCustomerID
WHERE (Tickets.dtCreated BETWEEN @startdate AND @enddate) AND (Tickets.dblTotal <= 0)
GROUP BY Customers.sBarcode, CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME)
HAVING (COUNT(*) > 1)
ORDER BY dtCreatedDate
입니다
: 이sBarcode dtcreated Date Number of Scans slastname
1234 1/4/2013 12:00:00 AM 2 Jimbo
1/5/2013 12:00:00 AM 3 Jimbo2
1578 1/6/2013 12:00:00 AM 3 Jimbo3
부질
SELECT customers.sbarcode,
Max(customers.slastname) AS LastName,
Cast(Floor(Cast(tickets.dtcreated AS FLOAT)) AS DATETIME) AS
dtCreatedDate,
Count(customers.sbarcode) AS
[Number of Scans],
Stuff ((SELECT ', '
+ RIGHT(CONVERT(VARCHAR, dtcreated, 100), 7) AS [text()]
FROM tickets AS sub
WHERE (lcustomerid = tickets.lcustomerid)
AND (dtcreated BETWEEN Cast(Floor(Cast(tickets.dtcreated
AS
FLOAT)) AS
DATETIME
)
AND
Cast(Floor(Cast(tickets.dtcreated
AS FLOAT
)) AS
DATETIME
)
+ '23:59:59')
AND (dbltotal <= '0')
FOR xml path('')), 1, 1, '') AS [Times Scanned]
FROM tickets
INNER JOIN customers
ON tickets.lcustomerid = customers.lcustomerid
WHERE (tickets.dtcreated BETWEEN @startdate AND @enddate)
AND (tickets.dbltotal <= 0)
GROUP BY customers.sbarcode,
Cast(Floor(Cast(tickets.dtcreated AS FLOAT)) AS DATETIME),
tickets.lcustomerid
HAVING (Count(*) > 1)
ORDER BY dtcreateddate
현재의 출력과 나의 현재 쿼리 (바코드없이 기록을 알 누락되었습니다) :
sBarcode dtcreated Date Number of Scans slastname Times Scanned
1234 1/4/2013 12:00:00 AM 2 Jimbo 12:00PM, 1:00PM
1578 1/6/2013 12:00:00 AM 3 Jimbo3 03:05PM, 1:34PM
길이가없는 'BETWEEN'과'VARCHAR' ... –
나는 customers.sbarcode를 그룹화하고 그 열의 수를 얻는 것이 흥미 롭다고 생각합니다. 당신이 별개의 것을 얻지 못하기 때문에 그것이 작동한다고 확신합니다.하지만이 카운트가 하나 이상이되기 위해서는 여러 카운트를 생성하는 다른 컬럼이 있어야합니다. 이 열을 카운트에 사용하면 가독성 측면에서 더 나을 것입니다. 어떤 테이블에 다른 테이블의 레코드에 참여하지 않는 레코드가 포함되어 있는지 설명 할 수 있습니까? 일치하는 [고객] 레코드가없는 다섯 개의 [티켓] 레코드가 있습니까? 솔루션은 아마도 왼쪽 조인이 될 것입니다. –
그들은 5 티켓 레코드이며 일치하는 고객 레코드가 있습니다. 하위 쿼리없이 쿼리를 실행하면 결과가 나옵니다. 누락 된 결과는 바코드가없는 5입니다. 나는 작동하는 쿼리와 출력을 게시 할 것이다. – Shmewnix