2017-02-28 55 views
0

需要以給定的查詢添加DISTINCT與ROW_NUMBER,我已經使用這個查詢的GridView在asp.net:-DISTINCT與ROW_NUMBER()

SELECT DISTINCT ROW_NUMBER() OVER (order by tbpan) AS 'Sr. No', 
     case when tbprofile = '3' then 'Applicant TBI' 
      when tbprofile = '4' then 'Prayas Center' 
      end 'Applicant Type', 
     REPLACE(ISNULL(DATEPART(yyyy,b.govtimevalid), '-'),0,'-') as 'Year', 
     [tbpan] AS 'Applicant Id', 
     ISNULL(a.PCId, '-') as 'PCId', 
     UPPER(tbname) AS 'Name', 
     UPPER(isnull(formstatus,'IN PROGRESS')) AS 'Form Status',UPPER(isnull(pmuapproval,'-')) AS 'PMU Status', 
     case when pmuapproval = 'valid' 
     then isnull (convert(Varchar, pmutimevalid, 107),'-') 
     else isnull (convert(Varchar, pmutimeinvalid, 107),'-') 
     end 'PMUDateTime', 
     UPPER(ISNULL(govapproval,'-')) AS 'PMC Status', 
     case when govapproval = 'valid' 
     then isnull (convert(Varchar, govtimevalid, 107),'-') 
     else isnull(convert(Varchar, govtimeinvalid, 107),'-') 
     end 'PMCDateTime', 
     ISNULL(SanctionedAmount,'0') AS 'Sanctioned Amount', 
     ISNULL((SanctionedAmount-BalDisbursed),'0') AS 'Total Disbursed',ISNULL(BalDisbursed,'0') AS 'Total Balance' 
     FROM tb_User a 
     LEFT OUTER JOIN applied b ON a.tbpan=b.tbid 
     LEFT OUTER JOIN tb_SanctionInfo c ON a.PCId = c.PCId 
     LEFT OUTER JOIN tb_DisbursedInfo d ON c.PCId = d.PCId WHERE tbprofile !='1' AND tbprofile !='2' 

Added image for reference

+6

樣本數據和預期的結果將有助於解釋你想要做什麼。另外,你的問題表明你可以詢問更簡單的查詢。 –

回答

0

噼它在一個CTE第一:

with CTE as 
(
SELECT DISTINCT 
     case when tbprofile = '3' then 'Applicant TBI' 
      when tbprofile = '4' then 'Prayas Center' 
      end 'Applicant Type', 
     REPLACE(ISNULL(DATEPART(yyyy,b.govtimevalid), '-'),0,'-') as 'Year', 
     [tbpan] AS 'Applicant Id', 
     ISNULL(a.PCId, '-') as 'PCId', 
     UPPER(tbname) AS 'Name', 
     UPPER(isnull(formstatus,'IN PROGRESS')) AS 'Form Status',UPPER(isnull(pmuapproval,'-')) AS 'PMU Status', 
     case when pmuapproval = 'valid' 
     then isnull (convert(Varchar, pmutimevalid, 107),'-') 
     else isnull (convert(Varchar, pmutimeinvalid, 107),'-') 
     end 'PMUDateTime', 
     UPPER(ISNULL(govapproval,'-')) AS 'PMC Status', 
     case when govapproval = 'valid' 
     then isnull (convert(Varchar, govtimevalid, 107),'-') 
     else isnull(convert(Varchar, govtimeinvalid, 107),'-') 
     end 'PMCDateTime', 
     ISNULL(SanctionedAmount,'0') AS 'Sanctioned Amount', 
     ISNULL((SanctionedAmount-BalDisbursed),'0') AS 'Total Disbursed',ISNULL(BalDisbursed,'0') AS 'Total Balance' 
     FROM tb_User a 
     LEFT OUTER JOIN applied b ON a.tbpan=b.tbid 
     LEFT OUTER JOIN tb_SanctionInfo c ON a.PCId = c.PCId 
     LEFT OUTER JOIN tb_DisbursedInfo d ON c.PCId = d.PCId WHERE tbprofile !='1' AND tbprofile !='2' 
) 
select CTE.*, ROW_NUMBER() OVER (order by [Applicant ID]) AS 'Sr. No' 
from CTE 

此外,對於SQL Server,使用[]別名,而不是「」

+0

SQL Server還支持分隔標識符的雙引號。爲什麼不選擇ANSI SQL方式,並編寫(更多)便攜式代碼? – jarlh

+0

「首先在CTE中拍攝它」...它仍然返回重複值。 –

+0

@sanjayprajapati然後在'select distinct ...'中的每一行之間必須有差別。 – JohnHC

2

試試這樣說:

SELECT ROW_NUMBER() OVER(ORDER BY SomeColumn) AS RowNr 
     ,tbl.* 
FROM 
(SELECT DISTINCT ....) AS tbl 

ROW_NUMBER()會爲每一行生成一個數字。 DISTINCT正在尋找相同的行。但是 - 因爲他們每一個正在運行的數量,它們並不相同......

0

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS 'Sr. No', 'Applicant Type','Applicant Id','PCId','Name', 'PMU Status','PMUDateTime','PMC Status', 
 
    'PMCDateTime','Sanctioned Amount','Total Balance' 
 
    FROM (
 
     DISTINCT 
 
     case when tbprofile = '3' then 'Applicant TBI' 
 
      when tbprofile = '4' then 'Prayas Center' 
 
      end 'Applicant Type', 
 
     REPLACE(ISNULL(DATEPART(yyyy,b.govtimevalid), '-'),0,'-') as 'Year', 
 
     [tbpan] AS 'Applicant Id', 
 
     ISNULL(a.PCId, '-') as 'PCId', 
 
     UPPER(tbname) AS 'Name', 
 
     UPPER(isnull(formstatus,'IN PROGRESS')) AS 'Form Status',UPPER(isnull(pmuapproval,'-')) AS 'PMU Status', 
 
     case when pmuapproval = 'valid' 
 
     then isnull (convert(Varchar, pmutimevalid, 107),'-') 
 
     else isnull (convert(Varchar, pmutimeinvalid, 107),'-') 
 
     end 'PMUDateTime', 
 
     UPPER(ISNULL(govapproval,'-')) AS 'PMC Status', 
 
     case when govapproval = 'valid' 
 
     then isnull (convert(Varchar, govtimevalid, 107),'-') 
 
     else isnull(convert(Varchar, govtimeinvalid, 107),'-') 
 
     end 'PMCDateTime', 
 
     ISNULL(SanctionedAmount,'0') AS 'Sanctioned Amount', 
 
     ISNULL((SanctionedAmount-BalDisbursed),'0') AS 'Total Disbursed',ISNULL(BalDisbursed,'0') AS 'Total Balance' 
 
     FROM tb_User a 
 
     LEFT OUTER JOIN applied b ON a.tbpan=b.tbid 
 
     LEFT OUTER JOIN tb_SanctionInfo c ON a.PCId = c.PCId 
 
     LEFT OUTER JOIN tb_DisbursedInfo d ON c.PCId = d.PCId WHERE tbprofile !='1' AND tbprofile !='2' 
 
\t \t) T

+0

ROW_NUMBER()OVER(ORDER BY(SELECT 1))對於Sr No Like 1,2,3 .... –