2017-08-29 7 views
0

2つの値を返すクエリがあります。私は最大値を持ちたいので、私はグループを作ってからMAXをします。しかし、私は3つの他のカラム(varchar)を持っています。SQLグループを使用して同じvarchar値を維持する

例。私が欲しいもの

OId  CId FName LName BName 

18477 110 Hubba Bubba whoa 
158  110 Test2 Person2 leee 

は OID CIDます。FName LNAME BNAME

18477 110 Hubba Bubba whoa 

は、だから私はCIDによってそれらをグループにしたいです。そして、私は最大の数字を保持したいと思っています。 FName、LName、またはBNameは、選択されているOldを持つものにしたいので、MinまたはMaxを使用できません。他の行のFName、LName、およびBNameは、私が欲しい/必要としない行です。

SELECT TOPを使用しようとしましたが、文字通り1行しか取得できません。倍数が必要です。あなたと仮定すると

SQL

INSERT INTO #CustomerInfoAll(FName, LName, BName, OwnerId, CustomerId) 
SELECT 
-- what goes here --(o.FirstName) AS FName, 
-- what goes here --(o.LastName) AS LName, 
-- what goes here --(o.BusinessName) AS BName, 
MAX(o.OId) AS OId, 
(r.CId) AS CId 
FROM Owner o 
INNER JOIN Report r 
ON o.ReportId = r.ReportId 
WHERE r.CId IN (SELECT CId FROM #ThisReportAll) 
AND r.Completed IS NOT NULL 
GROUP BY r.CId 
ORDER BY OId DESC; 
+0

どのバージョンのSQL Serverですか? – ErikE

+0

私が現在使用しているSQL Serverは2008 R2 –

答えて

1

は、SQL Server 2005以降を持っている:

INSERT INTO #CustomerInfoAll (FName, LName, BName, OwnerId, CustomerId) 
SELECT 
    FirstName, 
    LastName, 
    BusinessName, 
    Id, 
    CId 
FROM 
    (
     SELECT 
     Seq = ROW_NUMBER() OVER (PARTITION BY r.CId ORDER BY o.Id DESC), 
     o.Id, 
     r.CId, 
     o.FirstName, 
     o.LastName, 
     o.BusinessName 
     FROM 
     dbo.Owner o 
     INNER JOIN dbo.Report r 
      ON o.ReportId = r.ReportId 
     WHERE 
     EXISTS (-- can be INNER JOIN instead if `CId` is unique in temp table 
      SELECT * 
      FROM #ThisReportAll tra 
      WHERE r.CId = tra.CId 
     ) 
     AND r.Completed IS NOT NULL 
     GROUP BY 
     o.Id, 
     r.CId, 
     o.FirstName, 
     o.LastName, 
     o.BusinessName 
    ) x 
WHERE 
    x.Seq = 1; 
  • は、すべてのオブジェクト(dbo.Ownerと​​)の完全なスキーマ名を使用しています。
  • 可能であれば、INの代わりに半結合(EXISTS句)またはINNER JOINを使用してください。
+0

です。あなたは今までにあなたが私の英雄です!!!! –

+0

さて、ありがとう!それは有り難いです。それを達成する他の方法がありますが、私はあなたにまともなものを与えました。 *非常に大きな*クエリの場合、パフォーマンスが向上する可能性がある他の手法もありますが、これは最も簡単な方法の1つです。 – ErikE

関連する問題