2013-07-15 1 views
0

У меня есть сложная проблема. Идея заключается в том, мне нужно отчетливое Serv_Acct из таблицы (Это очень просто и у меня уже есть, что):SQL Server DISTINCT ИЛИ GROUP BY TEMP TABLES

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 не Distinct больше! Моя цель - получить только отдельный Serv_Acct (который равен 16) с последней учетной записью. Любая помощь в том, как это сделать? Я спросил друга, и она сказала мне, что я могу сделать это с помощью временных таблиц! Это правда?

ответ

1

Попробуйте использовать первый запрос, который вы указали как подзапрос, и присоедините его к 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 

Обратите внимание, как это будет возвращать только записи из исходного запроса, но будет иметь прилагается соответствующий номер счета. Обратите внимание: если у вас есть несколько номеров учетных записей с одинаковой датой, будет возвращено больше записей.

+0

Thank you Mike !! Это то, что я точно ищу, не могли бы вы показать мне, как вы можете это сделать с помощью временных таблиц? Еще раз спасибо. –