2013-08-08 2 views
0

Я получаю дублированные данные в своем GridView, а вытаскивая информацию с SQL Server. Я использую хранимые процедуры и используя некоторые C# для установки параметров, а затем используя SqlDataSource, чтобы поместить данные sql из хранимой процедуры в GridView. Я рассмотрел некоторые другие проблемы, подобные моим, но SQL-скрипты отличались от моих. Я также знаю, что мой C# код работает просто отлично, но я вывешу, что также,Избавление от дублированных данных в GridView

Вот код:

SQL:

SELECT 
    people.name, comage.age, grad.date 
FROM 
    people 
INNER JOIN 
    (SELECT age, MAX(term)[term] 
    FROM comage GROUP BY date) comage ON people.term = comage.term 
INNER JOIN 
    (SELECT date, MAX(term)[term] 
    FROM grad GROUP BY date) grad ON people.term = grad.term 
WHERE 
    people.ID = @ID 
ORDER BY 
    LastName 

ASP.net:

<asp:GridView ID="grid" runat="server"></GridView> 

C# код:

SqlCommand cmd = new SqlCommand(); 
    cmd.CommandText = "prcedureName"; 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    SqlParameter param = null; 
    param = cmd.Parameters.Add("@ID",System.Data.SqlDataType.NChar,255); 
    param.Direction = System.Data.ParameterDirection.Input; 
    param.value = in; //in is a string of some value 
    cmd.Connection = con; //con is a SqlConnection of some sort 
    SqlDataAdapter adp = new SqlDataAdapter(cmd); 
    SqlCommandBuilder command = new SqlCommandBuilder(adp); 
    DataTable data = new DataTable(); 
    data.Locale = System.Globalization.CultureInfo.InvariantCulture; 
    adp.Fill(data); 
    grid.DataSource = data; 
    grid.AutoGenerateColumns = true; 
    grid.DataBind(); 

Вот таблицы:

люди стол:

-------------------- 
    |name | ID | term | 
    -------------------- 
    |jeff | 0 | A | 
    |Jake | 1 | B | 
    -------------------- 

comage стол:

-------------------- 
    |Age | Term  | 
    -------------------- 
    |23 | A  | 
    |25 | B  | 
    -------------------- 

град стол:

-------------------- 
    | Date | Term | 
    -------------------- 
    | DEC |  A  | 
    | SUM |  B  | 
    -------------------- 
+0

[SELECT DISTINCT. , , ;] (http://www.w3schools.com/sql/sql_distinct.asp) - Не эксперт, хотя. –

+0

Я нашел другого человека с той же проблемой, что и я, но он сначала использовал SELECT DISTINCT и все еще имел проблему ... все равно попытаюсь это сделать. –

+0

да, это не сработало для меня, но спасибо за предложение :-) –

ответ

2

У вас нет уверенных в себе ваших агрегатов в вашем SQL. Я бы ожидал, что это будет написано примерно так:

SELECT people.name, Max(comage.age) age, Max(grad.date) date 
FROM people 
INNER JOIN comage ON people.term = comage.term 
INNER JOIN grad ON people.term = grad.term 
WHERE people.ID = @ID 
GROUP BY people.name 
ORDER BY LastName 

Какой будет производить набор результатов, как это:

name | age | date 
------------------ 
Jeff | 23 | DEC 
Jake | 25 | SUM 
+0

Я согласен с вами, агрегация не имела для меня никакого смысла – Charles380

0

я получаю только одну запись, на основе ID я представил.

DECLARE @People TABLE ([Name] VARCHAR(10), ID INT, Term VARCHAR(10)); 
DECLARE @Comage TABLE (Age INT, Term VARCHAR(10)); 
DECLARE @Grad TABLE ([Date] VARCHAR(10), Term VARCHAR(10)); 
DECLARE @ID INT; 

SET @ID = 0; 

INSERT INTO @People VALUES ('Jeff', 0, 'A'); 
INSERT INTO @People VALUES ('Jake', 1, 'B'); 

INSERT INTO @Comage VALUES (23, 'A'); 
INSERT INTO @Comage VALUES (25, 'B'); 

INSERT INTO @Grad VALUES ('DEC', 'A'); 
INSERT INTO @Grad VALUES ('SUM', 'B'); 

SELECT age, MAX(term) [term] 
INTO #Comage 
FROM @Comage 
GROUP BY [Age] 

SELECT [Date], MAX(term) [term] 
INTO #Grad 
FROM @Grad GROUP BY [Date] 

SELECT 
    p.name, c.age, g.[Date] 
FROM 
    @People p 
INNER JOIN #Comage c 
    ON c.term = p.term 
INNER JOIN #Grad g 
    ON g.term = p.term 
WHERE 
    p.ID = @ID 

DROP TABLE #Comage 
DROP TABLE #Grad 
Смежные вопросы