【问题标题】:SQL statement to Distinct results and add data in other columns用于区分结果并在其他列中添加数据的 SQL 语句
【发布时间】:2015-08-24 15:08:51
【问题描述】:

我有一个程序(用 VB.NET 编写)将数据写入 SQL Server 数据库。我知道编写语句来访问该数据并将其呈现给用户。

我卡住的地方是我有一个DataGridView 设置,第一列是用户支付的账单列表。我用

SELECT DISTINCT [PayTo] 
FROM Main_Bills

填充此列并且它可以工作。

接下来的列是每个月,最后一列是迄今为止支付的总额。我不确定如何填充剩余的列并让它们显示,即使它们是空的。我想要完成的是:

  1. 显示所有列,即使它们不包含数据。
  2. 在数据库中搜索当月支付的每笔账单,并将其汇总为相应的账单。
  3. 用当年每笔账单支付的总金额更新最后一列。

如果数据库包含示例:

Bill Paid To       Date     Amount
----------------------------------
Electric Company   8/20/15  100.00
Electric Company   8/21/15  50.00
Water Company      8/15/15  25.00

因此,当前设置仅在第一列中显示电力公司一次,这是我想要的以及水务公司。我需要做的是基于年份(这样它只显示当年支付的账单)。我需要将 2 笔电费加在一起,并在 8 月列中显示第 1 列中的 Electric company 项目。然后与水相同。显然,系统中的账单会比这个多。

我希望这一切都有意义。代码部分如下:

Sub SummaryTab_Fill()
Try
con = New SqlConnection(conString)
cmd = New SqlCommand("SELECT DISTINCT [PayTo] FROM Main_Bills", con)
con.Open()
reader = cmd.ExecuteReader()
table = New DataTable
table.Load(reader)
DGVBillSum.AutoGenerateColumns = True
DGVBillSum.RowHeadersVisible = False
DGVBillSum.DataSource = table
DGVBillSum.ColumnCount = 14
DGVBillSum.Columns(0).Name = "Paid To"
DGVBillSum.Columns(1).Name = "January"
DGVBillSum.Columns(2).Name = "February"
DGVBillSum.Columns(3).Name = "March"
DGVBillSum.Columns(4).Name = "April"
DGVBillSum.Columns(5).Name = "May"
DGVBillSum.Columns(6).Name = "June"
DGVBillSum.Columns(7).Name = "July"
DGVBillSum.Columns(8).Name = "August"
DGVBillSum.Columns(9).Name = "September"
DGVBillSum.Columns(10).Name = "October"
DGVBillSum.Columns(11).Name = "November"
DGVBillSum.Columns(12).Name = "December"
DGVBillSum.Columns(13).Name = "Total"
DGVBillSum.Sort(DGVBillSum.Columns(0), ComponentModel.ListSortDirection.Ascending)
DGVBillSum.Refresh()
con.Close()
Catch ex As Exception
 'I need to add my catch statement
End Try

【问题讨论】:

  • 您可能想要做的是在支付给列的账单上选择不同的选项。然后遍历每一行,对支付的账单进行选择,以获取每家公司的所有行。然后将总计添加到每个月。并将其放在临时表或另一个表中,然后在您的网格视图中选择并显示这些结果
  • 我原本打算创建另一个表,并让一个表来填充我的第一列,然后第二列来处理数学部分,但我认为这会让人感到困惑。我对编写 SQL 语句和 VB.NET 还是很陌生。这就是为什么我要编写一个家庭使用的收入和账单计划,以扩展我已经学到的知识并扩展到我们在课堂上没有涵盖的领域。阅读您的评论后,我想我应该首先将结果过滤到当年支付的所有账单。然后用VB对表格的结果进行过滤?

标签: sql sql-server vb.net


【解决方案1】:

我建议您获取当年的所有记录并将它们汇总到一个函数中。

Sub SummaryTab_Fill(conString As String)
    Try
        Dim con As SqlConnection = New SqlConnection(conString)
        Dim cmd As SqlCommand = New SqlCommand(string.Format("SELECT * FROM Main_Bills WHERE Date BETWEEN '{0}/1/1' AND '{0}/12/31", Date.Now.Year), con)
        con.Open()
        Dim reader As SqlDataReader = cmd.ExecuteReader()
        Dim table As DataTable = New DataTable
        table.Load(reader)

        Dim dataSource As Datatable 
        datasource = AggregateData(table)

        DGVBillSum.AutoGenerateColumns = True
        DGVBillSum.RowHeadersVisible = False
        DGVBillSum.DataSource = datasource
        DGVBillSum.ColumnCount = 14
        DGVBillSum.Columns(0).Name = "Paid To"
        DGVBillSum.Columns(1).Name = "January"
        DGVBillSum.Columns(2).Name = "February"
        DGVBillSum.Columns(3).Name = "March"
        DGVBillSum.Columns(4).Name = "April"
        DGVBillSum.Columns(5).Name = "May"
        DGVBillSum.Columns(6).Name = "June"
        DGVBillSum.Columns(7).Name = "July"
        DGVBillSum.Columns(8).Name = "August"
        DGVBillSum.Columns(9).Name = "September"
        DGVBillSum.Columns(10).Name = "October"
        DGVBillSum.Columns(11).Name = "November"
        DGVBillSum.Columns(12).Name = "December"
        DGVBillSum.Columns(13).Name = "Total"
        DGVBillSum.Sort(DGVBillSum.Columns(0), ListSortDirection.Ascending)
        DGVBillSum.Refresh()

        con.Close()
    Catch ex As Exception
     'I need to add my catch statement
    End Try
End Sub

Function AggregateData(sqlTable As DataTable) as Datatable

    Dim table As New DataTable

    ' Creates the primary key column
    table.Columns.Add("PaidTo", GetType(String))
    table.PrimaryKey = new DataColumn(){table.Columns("PaidTo")} 'This is necessary to use table.Rows.Find()
    ' Creates the months column and total
    table.Columns.Add(CreateMonthColumn("January"))
    table.Columns.Add(CreateMonthColumn("February"))
    table.Columns.Add(CreateMonthColumn("March"))
    table.Columns.Add(CreateMonthColumn("April"))
    table.Columns.Add(CreateMonthColumn("May"))
    table.Columns.Add(CreateMonthColumn("June"))
    table.Columns.Add(CreateMonthColumn("August"))
    table.Columns.Add(CreateMonthColumn("September"))
    table.Columns.Add(CreateMonthColumn("October"))
    table.Columns.Add(CreateMonthColumn("November"))
    table.Columns.Add(CreateMonthColumn("December"))
    table.Columns.Add(CreateMonthColumn("Total")) 
    table.Columns("Total").Expression = "January + February + March + April + May ..." 'This expression is like using SQL


    For Each row as DataRow in sqlTable.Rows

        Dim companyRow As DataRow
        companyRow = table.Rows.Find(row("PaidTo"))

        if IsNothing(companyRow) Then 'If there is no previous record of this company, create a new record
            companyRow = table.NewRow()
            companyRow("PaidTo") = row("PaidTo")
            table.Rows.Add(companyRow)
        End If 


        Dim payDate As DateTime = row("Date")
        Dim amoutValue As Double = row("Amount")
        'Let's aggregate for each month
        Select Case payDate.Date.Month
            Case 1
                   'Can't recall if this works: companyRow["January"] += amoutValue
                   companyRow("January") = ctype(companyRow("January"),double) + amoutValue

            Case 2


         End Select
    Next

    AggregateData = table

End Function

'Avoid repetition

Function CreateMonthColumn(name As String) As Datacolumn
    Dim column As DataColumn

    column = New DataColumn
    With column
       .ColumnName = name
       .DataType = GetType(Double)
       .DefaultValue = 0
       .Unique = False 
    End With

    CreateMonthColumn = column
End Function

【讨论】:

  • 谢谢,今天晚些时候我会试一试,然后报告。如果我得到它的工作,我会确保标记为答案。
  • 我试了一下,但那里有很多语法错误。对许多人来说,我要尝试修复。我仍在努力。谢谢。
  • 您可以查看答案吗?有机会创建一个 vb.net 项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
相关资源
最近更新 更多