【问题标题】:C# SQL Query for Hiding Multiple String And Showing The First Line With The Same Identifier用于隐藏多个字符串并显示具有相同标识符的第一行的 C# SQL 查询
【发布时间】:2016-04-04 03:14:49
【问题描述】:

我正在尝试使用 C# 中的 datagrid 创建一个报告,它将显示多个数据,但如果它们在表中具有相同的值,则会隐藏标识符。

结果应该是这样的

这是我在数据库中获取数据的代码和查询。

//Seperated public class
public DataTable ViewDailyRecord(BELReport belreport) {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = dbcon.getcon();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT * FROM ReportStorageDetails WHERE Date=@Date";
        cmd.Parameters.AddWithValue("@Date",belreport.DailyReport);

        SqlDataReader dr = cmd.ExecuteReader();
        DataTable table = new DataTable();
        table.Load(dr);

        return table;
}

// Code inside my form
belreport.DailyReport = Convert.ToDateTime(date_day_Daily.Text).ToString("yyyy-MM-dd");

DataTable table = balreport.ViewDailyRecord(belreport);

dgv_daily.DataSource = table;

提前谢谢你。

【问题讨论】:

  • 有什么问题?例外?结果不一样??
  • 你想用 SQL 还是 C# 来操作数据?
  • 没有。这没有问题。我想做的就是上面那个excel格式。要知道,如果使用原生 select * from 选择表中的所有数据,它只会显示所有查询。我想要的是,如果标识符有多个副本,那么它将隐藏标识符(第一个除外),但具有相同标识符的值将保持可见。
  • @Stringfellow 我不知道是否有关于此的查询。否则,C# 中有一个属性,数据网格将为我执行此操作。 :(
  • 如果我要在 C# 中解决它,我会按第一列排序,然后遍历这组行。在迭代时,我会跟踪我遇到的值,然后将后续相同命名的值设置为空字符串。

标签: c# sql sql-server sql-server-2014


【解决方案1】:

拥有 SQL Server Management Studio 2014 并不意味着 SQL Server 的版本相同,但无论如何..

在 SQL Server 2012+ 中,您可以使用 LAG 函数来获取“上一个”行的值。 “前一个”的定义取决于行的顺序,因此您需要能够以有意义的方式对它们进行排序。

SELECT
    CASE WHEN ColumnA = LAG(ColumnA) OVER (ORDER BY ColumnA, ColumnB)
    THEN '' ELSE ColumnA END AS FinalColumnA
    ,ColumnB
    ,CASE WHEN ColumnC = LAG(ColumnC) OVER (ORDER BY ColumnA, ColumnB)
    THEN '' ELSE ColumnC END AS FinalColumnC
    ,ColumnD
FROM ReportStorageDetails
WHERE Date=@Date
ORDER BY ColumnA, ColumnB;

通常,这种后处理是在客户端完成的(使用 C#),因为最终用户通常能够根据自己的喜好重新排序行。

【讨论】:

  • 我如何使用它我的类查询:/
  • 只需将此查询放入您的代码中,而不是您的SELECT。那有什么问题?显然,输入列的名称而不是 ColumnABC...。
  • 是的,我知道。我现在正在测试它。 :)
  • 如果我不仅要隐藏标识符,还要隐藏 ColumnC(如果有相同的值)怎么办。我应该在哪里添加它?
  • @mark,我更新了答案。只需使用与ColumnA 相同的方法即可。使用LAG获取上一行的值,检查是否相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2020-12-11
  • 2015-05-27
  • 2013-12-16
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多