[英]SQL Server DISTINCT OR GROUP BY WITH TEMP TABLES
我有一個復雜的問題。 這個想法是,我需要一個表中的Serv_Acct(這很簡單,我已經知道了):
DECLARE
@CustomerID int = 8,
@UtilityCompanyID int = 1
SELECT DISTINCT SERV_ACCT, MAX(INV_DATE)
FROM tblAPSData
WHERE SERV_ACCT NOT IN (SELECT ServiceAccount
FROM tblMEP_Meters
JOIN tblMEP_Sites
ON tblMEP_Meters.SiteID = tblMEP_Sites.ID
JOIN tblMEP_Projects
ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID
WHERE CustomerID = 8
AND Type = 1
)
AND ACCOUNT IN (SELECT AccountNumber
FROM tblMEP_CustomerAccounts
WHERE CustomerID = @CustomerID
AND UtilityCompanyID = @UtilityCompanyID)
AND INV_DATE > DATEADD(month, -6, getdate())
GROUP BY SERV_ACCT
運行此命令時,我得到16行:
SERV_ACCT (No column name)
0289S61288 2013-06-12 00:00:00.000
0492S90281 2013-06-12 00:00:00.000
1303S90280 2013-06-12 00:00:00.000
1435S01282 2013-06-12 00:00:00.000
1440S13289 2013-06-24 00:00:00.000
1548S00286 2013-06-12 00:00:00.000
2498S21288 2013-06-12 00:00:00.000
5384S92284 2013-06-24 00:00:00.000
5538S21284 2013-06-12 00:00:00.000
6109S12286 2013-06-12 00:00:00.000
7358S00281 2013-06-12 00:00:00.000
7488S22289 2013-06-12 00:00:00.000
8058S12287 2013-06-12 00:00:00.000
9058S00288 2013-06-12 00:00:00.000
9168S00282 2013-06-12 00:00:00.000
9645S21281 2013-06-12 00:00:00.000
現在,我沒有得到的部分是,每個服務帳戶都有一個帳號,並且某些服務帳戶具有多個帳號,我只想要帶有一個最新日期的服務帳號。 當我嘗試以這種方式查看問題:
DECLARE
@CustomerID int = 8,
@UtilityCompanyID int = 1
SELECT DISTINCT SERV_ACCT, ACCOUNT, MAX(INV_DATE)
FROM tblAPSData
WHERE SERV_ACCT NOT IN (SELECT ServiceAccount
FROM tblMEP_Meters
JOIN tblMEP_Sites
ON tblMEP_Meters.SiteID = tblMEP_Sites.ID
JOIN tblMEP_Projects
ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID
WHERE CustomerID = 8
AND Type = 1
)
AND ACCOUNT IN (SELECT AccountNumber
FROM tblMEP_CustomerAccounts
WHERE CustomerID = @CustomerID
AND UtilityCompanyID = @UtilityCompanyID)
AND INV_DATE > DATEADD(month, -6, getdate())
GROUP BY SERV_ACCT, ACCOUNT
ORDER BY SERV_ACCT
現在的結果如下:
SERV_ACCT ACCOUNT (No column name)
0289S61288 117512280 2013-06-12 00:00:00.000
0492S90281 117512280 2013-06-12 00:00:00.000
0492S90281 651412281 2013-04-08 00:00:00.000
1303S90280 117512280 2013-06-12 00:00:00.000
1435S01282 117512280 2013-06-12 00:00:00.000
1440S13289 312937281 2013-06-24 00:00:00.000
1548S00286 117512280 2013-06-12 00:00:00.000
1548S00286 308710287 2013-04-08 00:00:00.000
2498S21288 117512280 2013-06-12 00:00:00.000
5384S92284 979437282 2013-06-24 00:00:00.000
5538S21284 117512280 2013-06-12 00:00:00.000
6109S12286 117512280 2013-06-12 00:00:00.000
7358S00281 117512280 2013-06-12 00:00:00.000
7358S00281 659710281 2013-04-08 00:00:00.000
7488S22289 117512280 2013-06-12 00:00:00.000
8058S12287 117512280 2013-06-12 00:00:00.000
9058S00288 117512280 2013-06-12 00:00:00.000
9168S00282 117512280 2013-06-12 00:00:00.000
9168S00282 570810282 2013-04-08 00:00:00.000
9645S21281 117512280 2013-06-12 00:00:00.000
如您所見,Serv_Acct不再不同了! 我的目標是僅使用最新帳戶獲取唯一的Serv_Acct(16)。 有什么幫助嗎? 我問一個朋友,她告訴我我可以用臨時表來做! 真的嗎?
嘗試使用您列出的第一個查詢作為子查詢,並將其加入tblapsdata。 它看起來像這樣:
DECLARE
@CustomerID int = 8,
@UtilityCompanyID int = 1
SELECT MD.SERV_ACCT, AD.ACCOUNT, MD.MAXINVDATE
FROM
(SELECT DISTINCT SERV_ACCT, MAX(INV_DATE) as MAXINVDATE
FROM tblAPSData
WHERE SERV_ACCT NOT IN (SELECT ServiceAccount
FROM tblMEP_Meters
JOIN tblMEP_Sites
ON tblMEP_Meters.SiteID = tblMEP_Sites.ID
JOIN tblMEP_Projects
ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID
WHERE CustomerID = 8
AND Type = 1
)
AND ACCOUNT IN (SELECT AccountNumber
FROM tblMEP_CustomerAccounts
WHERE CustomerID = @CustomerID
AND UtilityCompanyID = @UtilityCompanyID)
AND INV_DATE > DATEADD(month, -6, getdate())
GROUP BY SERV_ACCT) MD
join tblAPSdata AD on MD.SERV_ACCT = AD.SERV_ACCT and MD.MAXINVDATE = AD.INV_DATE
請注意,這將僅返回原始查詢中的記錄,但將附加適當的帳號。 請注意,如果您有多個具有相同日期的帳號,則將返回更多記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.