2016-09-16 13 views
1

ちょっとこれはすべてのクエリは、私がこれまで持っている:窓関数を使用して合計数を取得します

WITH LIMIT AS 
     (SELECT 
      U.userID 
      ,U.username 
      ,U.fname  
      ,U.mname  
      ,U.lname  
      ,U.email  
      ,U.active 
      ,S.sName 
      ,S.sID 
      ,T.[value] 
      ,T.trackingNumberID 
      ,SU.primaryLocation 
      ,row_number() OVER (ORDER BY U.userid) AS RN 
      ,COUNT(*) OVER (ORDER BY U.userid) AS CNT 
      ,UR.roleID 
     FROM 
      [---].[dbo].[tblUsers]       AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T 
      ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU]     AS SU 
      ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS]     AS S 
      ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles]   AS UR 
      ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles]    AS R 
      ON UR.roleID = R.roleID 
     WHERE 
      U.active = 1 
     AND 
      SU.primaryLocation = 1 
     AND 
      SU.active = 1 
     AND 
       U.orgID = 1 
      AND 
       S.ID = 35 
      AND U.userID IN (SELECT userID 
           FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S 
           ON S.sID = SU.sID 
           WHERE 
           SU.active = 1 
           AND 
           S.sID = 35) 
) SELECT * FROM LIMIT WHERE RN Between 0 AND 10000 

私はU. BY COUNT(*)OVER(ORDERをしようとしています上記のクエリで見ることができるようにユーザーID)AS CNTこれは私にと同じカウントを与えるRNです。私は必要なもの

は、このバック(842行)をもたらすことになるの記録の総量です。

+0

Count(*)を実行してパーティションを作成しないでください。これはあなたが必要とするものではないでしょうか? – scsimon

+0

Haそれは@a_horse_with_no_nameだった。私はあなたに信用を与えることができるように正式な答えをしてください。 – StealthRT

+0

あなたは1000行未満に制限するためにRNを使用していますか?代わりに、TopまたはFetchを使用してください。 – Hogan

答えて

2

は、「実行中のカウント」 - 「その」行までのカウントを調整します。あなたは完全な結果のすべての行をカウントしたい場合は、これはカッコウを聞こえるかもしれないが、私はあなたが変数にカウント数を選択した場合、あなたがより良いパフォーマンスを得る大きなテーブルで発見され、order by

COUNT(*) OVER() AS CNT 
1

せずにウィンドウ関数を使用しますあなたのレコードを選択し、変数を追加するだけです。 count(*)over()を持つものは、テーブルが大きすぎるとパフォーマンスが低下します。

DECLARE @RecordCount INT 
SELECT @RecordCount = COUNT(*) 
FROM [---].[dbo].[tblUsers] AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU] AS SU ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS] AS S ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles] AS UR ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles] AS R ON UR.roleID = R.roleID 
WHERE U.active = 1 
     AND SU.primaryLocation = 1 
     AND SU.active = 1 
     AND U.orgID = 1 
     AND S.ID = 35 
     AND U.userID IN (SELECT userID 
         FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S ON S.sID = SU.sID 
         WHERE SU.active = 1 
           AND S.sID = 35) 

SELECT U.userID, 
     U.username, 
     U.fname, 
     U.mname, 
     U.lname, 
     U.email, 
     U.active, 
     S.sName, 
     S.sID, 
     T.[value], 
     T.trackingNumberID, 
     SU.primaryLocation, 
     @RecordCount AS CNT, 
     UR.roleID 
FROM [---].[dbo].[tblUsers] AS U 
     LEFT OUTER JOIN [---].[dbo].[tblTrackingNumbers] AS T ON T.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblSU] AS SU ON U.userID = SU.userID 
     LEFT OUTER JOIN [---].[dbo].[tblS] AS S ON SU.sID = S.sID 
     LEFT OUTER JOIN [---].[dbo].[tblUserRoles] AS UR ON UR.userID = U.userID 
     LEFT OUTER JOIN [---].[dbo].[tblRoles] AS R ON UR.roleID = R.roleID 
WHERE U.active = 1 
     AND SU.primaryLocation = 1 
     AND SU.active = 1 
     AND U.orgID = 1 
     AND S.ID = 35 
     AND U.userID IN (SELECT userID 
         FROM [---].[dbo].[tblSU] AS SU 
           INNER JOIN [].[dbo].[tblS] AS S ON S.sID = SU.sID 
         WHERE SU.active = 1 
           AND S.sID = 35) 
ORDER BY U.userID 
OFFSET 0 ROWS FETCH NEXT 10000 ROWS ONLY 
+0

良い点も、ジェイミー。 – StealthRT

関連する問題