我有一個查詢,檢查數據庫以查看客戶是否每天訪問多次。如果他們有它訪問的次數,然後告訴我他們訪問的次數。問題是它將「Tickets.lcustomerid」引入group by子句,導致我錯過了5條記錄(沒有條碼的客戶)。如何更改以下查詢以從group by子句中刪除「tickets.lcustomerid」...如果將其刪除,則會收到一個錯誤,告訴我「Tickets.lCustomerID」不是有效的選擇,因爲它不是聚合的一部分或groupby子句。Group按列拋出查詢
的作品查詢:
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's和'VARCHAR'沒有長度... –
我認爲有趣的是,你正在對customers.sbarcode進行分組並獲取該列的數量。我敢肯定它是有效的,因爲你沒有得到一個明確的,但爲了這個計數不止一個,必須有一些其他列創建多個計數;從可讀性的角度來看,使用這一列進行計數會更好。你能解釋哪張表包含未加入其他表中的記錄的記錄?有五張[票據]記錄沒有匹配的[客戶]記錄,反之亦然?解決方案可能是左連接。 –
它們是5張票據記錄,並且DO有匹配的客戶記錄。如果我運行查詢,而不是子查詢,我會得到結果。缺少的結果是5沒有條形碼。我將發佈可用的查詢和輸出。 – Shmewnix