【问题标题】:How to calculate daily sales with vb.net and sql如何用vb.net和sql计算每日销售额
【发布时间】:2022-11-22 02:01:21
【问题描述】:

我想通过日期汇总我的账单表中的金额并报告为每日销售额

表列是 客户名称、金额、BDate 这是我试过的

   Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = ? "
        Dim conkey As New SqlConnection(con)
        Dim cmd = New SqlCommand(query, conkey)
        cmd.Parameters.AddWithValue("@BDate", Now.ToString("MM/dd/yyyy"))

        conkey.Open()
        Dim total As Double = Convert.ToDouble(cmd.ExecuteScalar())
        check.Text = total.ToString
        conkey.Close()

【问题讨论】:

  • 你为什么要传递一个日期字符串?是约会。如果你想按数字过滤,你会把数字转换成字符串吗?我对此表示怀疑。
  • 您需要提供更多详细信息,具体说明您正在尝试实现什么,以及当您使用您拥有的代码时会发生什么,以及它如何不满足您的要求。
  • 利用命名参数使用 SqlClient 而不是 ? 占位符。

标签: sql-server vb.net sum


【解决方案1】:

我知道这不是答案,但我还不能添加 cmets :(.

您能否包括 Sales 表的 DDL 以及一些示例数据,并包括您希望从针对该示例数据运行查询返回的结果? 这可能对解决您的问题有很大帮助。

乍一看,您的解决方案似乎应该可以工作,但如果没有 DDL 和示例数据以及所需的结果,我无法做出明确的陈述。

如果你只想按日期销售,而不考虑ClientName,你可以试试这个:

SELECT [BDate], SUM([Amount]) AS Sales FROM [BillTbl] GROUP BY [BDate]

如果这是 SQL Server,并且您的 BDate 列也包含时间值,您可以试试这个:

SELECT CAST([BDate] AS DATE), SUM([Amount]) AS [Sales] FROM [BillTbl] GROUP BY CAST([BDate] AS DATE)

或者,如果您有旧版本的 SQL Server,这应该可以工作:

SELECT CONVERT(VARCHAR(10), [BDate], 102), SUM([Amount]) AS [Sales] FROM [BillTbl] GROUP BY CONVERT(VARCHAR(10), [BDate], 102)

(再次抱歉,请原谅我的无知,这只是我第二次尝试回答,就像我说的,它真的应该是评论。)

我希望这对某人有一定的价值。 注意:索引对我的示例查询没有多大帮助,但如有必要,也有解决方法。

【讨论】:

    【解决方案2】:

    假设 BDate 的类型是 DateDateTime 并且不是varchar(这将是很坏):

    Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = cast(current_timestamp as Date)"
    
    Using conkey As New SqlConnection(con), _
          cmd As New SqlCommand(query, con)
    
        conkey.Open()
        Dim total As Decimal = Convert.ToDecimal(cmd.ExecuteScalar())
    End Using
    

    我还想谈谈查询参数,但如您所见,上面的代码中根本不需要任何参数。数据库有自己的方式来获取当前时间。因此,我将添加另一个示例来展示使用(现在不需要的)参数的正确方法:

    Dim query = "SELECT SUM(Amount)as sales FROM BillTbl where [BDate] = @BDate"
    
    Using conkey As New SqlConnection(con), _
          cmd As New SqlCommand(query, con)
    
        ' Always choose an SqlDbType and Length to match the database column
        cmd.Parameters.Add("@BDate", SqlDbType.Date).Value = DateTime.Today
        conkey.Open()
        Dim total As Decimal = Convert.ToDecimal(cmd.ExecuteScalar())
    End Using
    

    请注意,查询中的参数占位符的名称与我们稍后使用的名称相匹配。另请注意,我们为参数指定了显式类型。 AddWithValue() 存在问题,可能会导致严重的性能问题。另一个变化是将 .Close() 替换为 Using 块,这样更安全。如果查询出现异常,.Close() 代码可能永远不会运行,但 Using 块仍将关闭连接。

    最后,在代码块完成后,这两个示例中的 total 变量不会立即超出范围。您可能需要在作用域中更早地声明变量以赋予它更大的作用域,然后此时只需设置值即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多