【问题标题】:stock calculation vb.net and sql股票计算 vb.net 和 sql
【发布时间】:2018-07-06 13:48:05
【问题描述】:

我的代码正在运行,但我认为还有另一种方法可以仅使用 sql。我正在考虑将这段代码简化为更简单。请帮忙 代码获取库存表的总和,然后从相同大米名称的事务表中减去,然后显示结果。但如果第二个查询为空,则显示第一个查询的结果,而无需从第二个查询中减去。

 Dim commnd2 As New SqlCommand("SELECT RICETYPE.RICENAME, Sum(STOCK.NUMBEROFSTOCKS) AS SumOfNUMBEROFSTOCKS FROM SUPPLIER INNER JOIN (RICETYPE INNER JOIN STOCK ON RICETYPE.ID = STOCK.RICETYPEID) ON SUPPLIER.ID = STOCK.SUPPLIER GROUP BY RICETYPE.RICENAME", cn)
    dr = commnd2.ExecuteReader()
    If dr.HasRows Then
        While dr.Read
            Dim commnd3 As New SqlCommand("SELECT RICETYPE.RICENAME, Sum(TRANSAC.NUMBEROFSALES) AS SumOfNUMBEROFSALES
            FROM RICETYPE INNER JOIN TRANSAC ON RICETYPE.ID = TRANSAC.RICETYPEID WHERE RICETYPE.RICENAME = '" & dr.Item(0) & "'
            GROUP BY RICETYPE.RICENAME
            ", cn)
            dr2 = commnd3.ExecuteReader()
            If dr2.HasRows Then
                While dr2.Read
                    dt.Rows.Add(dr2.GetValue(0), dr.GetValue(1) - dr2.GetValue(1), dr2.GetValue(1))
                End While
            Else
                dt.Rows.Add(dr.GetValue(0), dr.GetValue(1), 0)
            End If
        End While
    End If

【问题讨论】:

  • 开始使用Option Strict,没有理由使用Off。通常这不会编译,因为您在dr.GetValue(1) - dr2.GetValue(1) 处相互减去对象。使用dr.GetInt32(1) - dr2.GetInt32(1)
  • 用您正在使用的数据库标记您的问题。
  • 旁注 - 始终使用参数化 sql 并避免字符串连接向 sql 语句添加值。见How can I add user-supplied input to an SQL statement?
  • 你标记了ssms-2017,如果这是Sql Server,你为什么要使用OleDb 类型(如OleDbCommand)而不是Sql 类型(如SqlCommand)?还有一个更合适的标签是sql-server,因为您没有直接在您发布的问题中对 SSMS 做任何事情。
  • 忘记更改为 SqlCommand。我已经更改了我的代码。我忘了为这篇文章编辑我的代码

标签: sql sql-server vb.net sum


【解决方案1】:

这是使用嵌套求和作为单个查询的一种方法。

SELECT RTO.RICENAME, Sum(ST.NUMBEROFSTOCKS) AS SumOfNUMBEROFSTOCKS, (SELECT Sum(TRANSAC.NUMBEROFSALES) AS SumOfNUMBEROFSALES
            FROM RICETYPE RTI INNER JOIN TRANSAC T ON RTI.ID = T.RICETYPEID WHERE RTI.RICENAME = RTO.RICENAME) 
FROM SUPPLIER S INNER JOIN (RICETYPE RTO INNER JOIN STOCK ST ON RTO.ID = ST.RICETYPEID) ON S.ID = ST.SUPPLIER GROUP BY RTO.RICENAME

RTI 是 RICETYPE 的内部引用,RTO 是外部引用。

【讨论】:

  • 非常感谢,我让它在我的新数据库中使用不同的列和表名称。但我的问题是了解它是如何工作的。
  • 这是一个嵌套查询...内部有一个计算来获取给定行的匹配名称的总和...rti 是要记录的内部别名...如果您喜欢... ..请接受...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2010-09-17
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多