2015-07-07 8 views
1

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

SELECT TOP (25) 
    [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[ICP_PRENOM] AS [ICP_PRENOM], 
    [Project1].[IDC_NOSOC] AS [IDC_NOSOC], 
    [Project1].[C3] AS [C3], 
    [Project1].[C4] AS [C4], 
    [Project1].[C5] AS [C5], 
    [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
    [Project1].[ADC_VILLE] AS [ADC_VILLE], 
    [Project1].[Libelle] AS [Libelle], 
    [Project1].[Libelle1] AS [Libelle1] 
    FROM (SELECT [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], [Project1].[IDC_NOSOC] AS [IDC_NOSOC], [Project1].[ICP_PRENOM] AS [ICP_PRENOM], [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], [Project1].[ADC_VILLE] AS [ADC_VILLE], [Project1].[Libelle] AS [Libelle], [Project1].[Libelle1] AS [Libelle1], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[C3] AS [C3], [Project1].[C4] AS [C4], [Project1].[C5] AS [C5], row_number() OVER (ORDER BY [Project1].[C1] ASC) AS [row_number] 
     FROM (SELECT 
      [Extent1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
      [Extent1].[IDC_NOSOC] AS [IDC_NOSOC], 
      [Extent2].[ICP_PRENOM] AS [ICP_PRENOM], 
      [Extent4].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
      [Extent4].[ADC_VILLE] AS [ADC_VILLE], 
      [Extent5].[Libelle] AS [Libelle], 
      [Extent6].[Libelle] AS [Libelle1], 
      LTRIM(RTRIM([Extent1].[IDC_NOM])) AS [C1], 
      LTRIM(RTRIM([Extent2].[ICP_NMNAISS])) AS [C2], 
      CAST([Extent2].[ICP_DTNAISS] AS datetime2) AS [C3], 
      CAST([Extent3].[ICR_DTCREA_ENTREPRISE] AS datetime2) AS [C4], 
      CASE WHEN ([Extent1].[IDC_CDPORTEFEUILLE] IS NULL) THEN N'''' ELSE CAST([Extent1].[IDC_CDPORTEFEUILLE] AS nvarchar(max)) END AS [C5] 
      FROM  [mdw].[IDENTITE_CONTACT] AS [Extent1] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PHYSIQUE] AS [Extent2] ON [Extent1].[IDC_IDCONTACT] = [Extent2].[ICP_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PROFESSIONNEL] AS [Extent3] ON [Extent1].[IDC_IDCONTACT] = [Extent3].[ICR_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[ADRESSE_CONTACT] AS [Extent4] ON [Extent1].[IDC_IDCONTACT] = [Extent4].[ADC_IDADR] 
      LEFT OUTER JOIN [mdw].[Ref_Profil_Contact] AS [Extent5] ON [Extent1].[IDC_CDPROFIL_CONTACT] = [Extent5].[Cod] 
      LEFT OUTER JOIN [mdw].[Ref_Statut] AS [Extent6] ON [Extent1].[IDC_CDSTATUTSOC] = [Extent6].[Cod] 
      WHERE (NOT ((9975 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND (NOT ((9976 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND ([Extent1].[IDC_CDPROFIL_CONTACT] = 'P') 
     ) AS [Project1] 
    ) AS [Project1] 
    WHERE [Project1].[row_number] > 0 
    ORDER BY [Project1].[C1] ASC' 

Я хочу также возвращать общее количество строк, а не только 25 строки, я не знаю, куда положить count(*). Всегда есть ошибка. Не могли бы вы мне помочь?

Заранее спасибо

+1

Добавить в выберите 'ROW_NUMBER() OVER (ORDER BY) [Project1] [C1] ASC' – Mihai

+0

я добавить счетчик (*) в котором вы упоминаете, но я вызываю ошибку: –

+0

столбец Project1.IDC_IDCONTACT недействителен, потому что не находится в функции агрегации или в предложении GROUP BY –

ответ

0

Вы можете добавить

к вашему запросу.

Для меня он работает отлично:

SELECT [id] 
    ,[p_value] 
    ,COUNT(1) OVER() AS records_count 
FROM [dbo].[tb_temp] 

Возвращает:

enter image description here

И для TOP (N) случае:

enter image description here

Оптимизированные для запроса производительности:

WITH QueryCTE AS 
(

    SELECT 
    [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[ICP_PRENOM] AS [ICP_PRENOM], 
    [Project1].[IDC_NOSOC] AS [IDC_NOSOC], 
    [Project1].[C3] AS [C3], 
    [Project1].[C4] AS [C4], 
    [Project1].[C5] AS [C5], 
    [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
    [Project1].[ADC_VILLE] AS [ADC_VILLE], 
    [Project1].[Libelle] AS [Libelle], 
    [Project1].[Libelle1] AS [Libelle1] 
    FROM (SELECT [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], [Project1].[IDC_NOSOC] AS [IDC_NOSOC], [Project1].[ICP_PRENOM] AS [ICP_PRENOM], [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], [Project1].[ADC_VILLE] AS [ADC_VILLE], [Project1].[Libelle] AS [Libelle], [Project1].[Libelle1] AS [Libelle1], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[C3] AS [C3], [Project1].[C4] AS [C4], [Project1].[C5] AS [C5], row_number() OVER (ORDER BY [Project1].[C1] ASC) AS [row_number] 
     FROM (SELECT 
      [Extent1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
      [Extent1].[IDC_NOSOC] AS [IDC_NOSOC], 
      [Extent2].[ICP_PRENOM] AS [ICP_PRENOM], 
      [Extent4].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
      [Extent4].[ADC_VILLE] AS [ADC_VILLE], 
      [Extent5].[Libelle] AS [Libelle], 
      [Extent6].[Libelle] AS [Libelle1], 
      LTRIM(RTRIM([Extent1].[IDC_NOM])) AS [C1], 
      LTRIM(RTRIM([Extent2].[ICP_NMNAISS])) AS [C2], 
      CAST([Extent2].[ICP_DTNAISS] AS datetime2) AS [C3], 
      CAST([Extent3].[ICR_DTCREA_ENTREPRISE] AS datetime2) AS [C4], 
      CASE WHEN ([Extent1].[IDC_CDPORTEFEUILLE] IS NULL) THEN N'''' ELSE CAST([Extent1].[IDC_CDPORTEFEUILLE] AS nvarchar(max)) END AS [C5] 
      FROM  [mdw].[IDENTITE_CONTACT] AS [Extent1] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PHYSIQUE] AS [Extent2] ON [Extent1].[IDC_IDCONTACT] = [Extent2].[ICP_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PROFESSIONNEL] AS [Extent3] ON [Extent1].[IDC_IDCONTACT] = [Extent3].[ICR_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[ADRESSE_CONTACT] AS [Extent4] ON [Extent1].[IDC_IDCONTACT] = [Extent4].[ADC_IDADR] 
      LEFT OUTER JOIN [mdw].[Ref_Profil_Contact] AS [Extent5] ON [Extent1].[IDC_CDPROFIL_CONTACT] = [Extent5].[Cod] 
      LEFT OUTER JOIN [mdw].[Ref_Statut] AS [Extent6] ON [Extent1].[IDC_CDSTATUTSOC] = [Extent6].[Cod] 
      WHERE (NOT ((9975 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND (NOT ((9976 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND ([Extent1].[IDC_CDPROFIL_CONTACT] = 'P') 
     ) AS [Project1] 
    ) AS [Project1] 
    WHERE [Project1].[row_number] > 0 
) 

SELECT TOP (25) 
    *  
    FROM QueryCTE 
CROSS APPLY (SELECT COUNT(1) AS record_count FROM QueryCTE) cnt_qry 
    ORDER BY [C1] ASC 

Результат:

enter image description here

+0

да это работает, но оно становится очень медленным. он делает 53 секунды, чтобы вернуть строку 811285 :( –

+0

Я добавил оптимизированный для версии производительности запрос, пожалуйста, используйте его для лучшей производительности –

0

Вы можете пользователь КТР, чтобы помочь вам в этом случае для того, чтобы пользователь запрос с использованием и без ТОП пункта.

Нечто подобное (безобразным, но должно работать):.

WITH QueryCTE AS 
(
SELECT 
    [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[ICP_PRENOM] AS [ICP_PRENOM], 
    [Project1].[IDC_NOSOC] AS [IDC_NOSOC], 
    [Project1].[C3] AS [C3], 
    [Project1].[C4] AS [C4], 
    [Project1].[C5] AS [C5], 
    [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
    [Project1].[ADC_VILLE] AS [ADC_VILLE], 
    [Project1].[Libelle] AS [Libelle], 
    [Project1].[Libelle1] AS [Libelle1] 
    FROM (SELECT [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], [Project1].[IDC_NOSOC] AS [IDC_NOSOC], [Project1].[ICP_PRENOM] AS [ICP_PRENOM], [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], [Project1].[ADC_VILLE] AS [ADC_VILLE], [Project1].[Libelle] AS [Libelle], [Project1].[Libelle1] AS [Libelle1], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[C3] AS [C3], [Project1].[C4] AS [C4], [Project1].[C5] AS [C5], row_number() OVER (ORDER BY [Project1].[C1] ASC) AS [row_number] 
     FROM (SELECT 
      [Extent1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
      [Extent1].[IDC_NOSOC] AS [IDC_NOSOC], 
      [Extent2].[ICP_PRENOM] AS [ICP_PRENOM], 
      [Extent4].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
      [Extent4].[ADC_VILLE] AS [ADC_VILLE], 
      [Extent5].[Libelle] AS [Libelle], 
      [Extent6].[Libelle] AS [Libelle1], 
      LTRIM(RTRIM([Extent1].[IDC_NOM])) AS [C1], 
      LTRIM(RTRIM([Extent2].[ICP_NMNAISS])) AS [C2], 
      CAST([Extent2].[ICP_DTNAISS] AS datetime2) AS [C3], 
      CAST([Extent3].[ICR_DTCREA_ENTREPRISE] AS datetime2) AS [C4], 
      CASE WHEN ([Extent1].[IDC_CDPORTEFEUILLE] IS NULL) THEN N'''' ELSE CAST([Extent1].[IDC_CDPORTEFEUILLE] AS nvarchar(max)) END AS [C5] 
      FROM  [mdw].[IDENTITE_CONTACT] AS [Extent1] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PHYSIQUE] AS [Extent2] ON [Extent1].[IDC_IDCONTACT] = [Extent2].[ICP_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PROFESSIONNEL] AS [Extent3] ON [Extent1].[IDC_IDCONTACT] = [Extent3].[ICR_IDCONTACT] 
      LEFT OUTER JOIN [mdw].[ADRESSE_CONTACT] AS [Extent4] ON [Extent1].[IDC_IDCONTACT] = [Extent4].[ADC_IDADR] 
      LEFT OUTER JOIN [mdw].[Ref_Profil_Contact] AS [Extent5] ON [Extent1].[IDC_CDPROFIL_CONTACT] = [Extent5].[Cod] 
      LEFT OUTER JOIN [mdw].[Ref_Statut] AS [Extent6] ON [Extent1].[IDC_CDSTATUTSOC] = [Extent6].[Cod] 
      WHERE (NOT ((9975 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND (NOT ((9976 = [Extent1].[IDC_CDPORTEFEUILLE]) AND ([Extent1].[IDC_CDPORTEFEUILLE] IS NOT NULL))) AND ([Extent1].[IDC_CDPROFIL_CONTACT] = 'P') 
     ) AS [Project1] 
    ) AS [Project1] 
    WHERE [Project1].[row_number] > 0 

) 
SELECT TOP (25) 
* 
,(SELECT COUNT(*) FROM QueryCTE) AS NBRows 
FROM QueryCTE 
ORDER BY [C1] ASC 
Смежные вопросы