2015-01-15 2 views
-3

Я хочу применить отдельный только CustomerID и получить последнюю запись, поскольку столбец RecordUpdate_date в моей таблице1.Отдельный один столбец в двух таблицах MS SQL Server 2008

Я написал этот запрос, но мне не хватает некоторых строк (записей) и получения дубликатов записей.

Пожалуйста, помогите мне с этим. Благодаря

Table1:

CustomerID, CustomerName, UpdateDate 

Table2:

CustomerID, DateofBirth 

Мой запрос:

SELECT a.CustomerID 
     ,a.CustomerName 
     ,a.RecordUpDate_date 
     ,b.DateofBirth 
    FROM Table1 AS a 
    INNER JOIN (
       SELECT CustomerID 
         ,MAX(RecordUpdate_date) AS max_RecordUpdate_date 
        FROM Table1 
        GROUP BY CustomerID 
       ) AS abc 
     ON abc.CustomerID = a.CustomerID 
      AND abc.max_RecordUpdate_date = a.RecordUpdate_date 
    INNER JOIN Table2 AS b 
     ON b.CustomerID = a.CustomerID 
    INNER JOIN (
       SELECT CustomerID 
         ,MAX(DateofBirth) AS max_dob 
        FROM table2 
        GROUP BY CustomerID 
       ) AS m 
     ON m.CustomerID = a.Customer 
      AND m.max_cus = c.DateofBirth 
+0

форму вашего кода для любви к Богу – DLeh

+0

Что вы хотите сделать? Приведите описание и несколько примеров записей. Во всяком случае, столы не выглядят нормально! – Alisa

+0

Вам нужен только отдельный список всех идентификаторов клиентов из обеих таблиц? Вы можете просто сделать DISTINCT CustomerID из каждой таблицы и объединить их вместе. – Xedni

ответ

0

Попробуйте это:

;WITH CTE 
     AS (SELECT CustomerID , 
        MAX(UpdateDate) max_RecordUpdate_date 
      FROM  dbo.Table1 
      GROUP BY CustomerID 
     ), 
    CTE1 
     AS (SELECT CustomerID , 
        MAX(DateofBirth) max_dob 
      FROM  dbo.Table2 
      GROUP BY CustomerID 
     ) 
SELECT CTE.CustomerID , 
     CustomerName , 
     max_RecordUpdate_date , 
     max_dob , 
     FLOOR((CAST (max_RecordUpdate_date AS INTEGER) 
       - CAST(max_dob AS INTEGER))/365.25) [Age] 
FROM CTE 
     INNER JOIN Table1 ON Table1.CustomerID = CTE.CustomerID 
          AND Table1.UpdateDate = CTE.max_RecordUpdate_date 
     LEFT JOIN CTE1 ON CTE1.CustomerID = CTE.CustomerID 
+0

Я не могу использовать этот, потому что у меня есть некоторые вычисления в моей инструкции select. Выберите a.CustomerID, a.CustomerName, a.RecordUpDate_date, b.DateofBirth, FLOOR ((CAST (a.RecordUpdate_date AS INTEGER) - CAST (c.DATEOFBIRTH AS INTEGER))/365.25) AS Age ... Можете ли вы добавить это расчет в решении? – SQL

+0

@SQL почему не эта информация в вопросе? Есть ли что-то еще важное для вашего решения, которое вы не удосужились рассказать кому-нибудь? –

+0

Это был единственный. Извините за отсутствие упоминания в вопросе. Я только что получил эту просьбу. – SQL

0
SELECT a.CustomerId, a.CustomerName, a.UpdateDate, b.DateofBirth 
FROM Table1 a 
INNER JOIN (SELECT CustomerId, MAX(UpdateDate) as UDate 
      FROM Table1 
      GROUP BY CustomerId 
      ) maxdate ON a.CustomerId = maxdate.CustomerId 
         AND a.UpdateDate = maxdate.UDate 
INNER JOIN Table2 b ON a.CustomerId = b.CustomerId 

Используйте SELECT DISTINCT, если у вас есть несколько записей для клиента и обновлены.

+0

Получение этой ошибки: выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с «внутренним». – SQL

1

Существует множество способов получить только последнюю запись. Лично я использую все время, чтобы использовать ROW_NUMBER()http://msdn.microsoft.com/en-us/library/ms186734.aspx.

Сначала в CTE мы подсчитываем строки на основе поля customerid и desc date. Затем вы выбираете, где rn =1 это получает только последнюю запись для каждого клиента.

;WITH CTE 
      AS (
       SELECT customerID 
        ,customerName 
        ,UpdateDate 
        ,ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY UpdateDate DESC) AS rn 
       FROM table1 AS a 
      ) 
    SELECT a.customerID 
      ,a.CustomerName 
      ,a.UpdateDate 
      ,b.DateOfBrith 
     FROM CTE a 
     JOIN table2 AS b 
      ON a.customerId = b.CustomerID 
     where a.rn = 1 
Смежные вопросы