Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将列合计为一行_Sql_Sql Server_Vb.net_Sql Server 2008 - Fatal编程技术网

Sql 如何将列合计为一行

Sql 如何将列合计为一行,sql,sql-server,vb.net,sql-server-2008,Sql,Sql Server,Vb.net,Sql Server 2008,我有一个SQL查询: Select Location, net_sales, total_visits, Avg_money_per_visit from Daily_Sales where day = @day Group By Location 它在VB.NET中运行并存储在数据表中,然后我将其转换为HTML并作为电子邮件正文发送 输出 Location Net_Sales Total Visits AVG Money Per Visit 1

我有一个SQL查询:

Select Location, net_sales, total_visits, Avg_money_per_visit
from Daily_Sales
where day = @day
Group By Location
它在VB.NET中运行并存储在数据表中,然后我将其转换为HTML并作为电子邮件正文发送

输出

Location       Net_Sales      Total Visits   AVG Money Per Visit
1               100                5                  20            
2                50                2                  25
3               200                2                  100
我希望输出结果与总计一致:

Location       Net_Sales      Total Visits   AVG Money Per Visit
1               100                5                  20            
2                50                2                  25
3               200                2                  100
Total:          350                9                  38.89
在转换为HTML之前,如何获取SQL或datatable中的sum列

下面是我如何转换为HTML的:

Public Function DataTableToHTMLTable(ByVal inTable As DataTable) As String
        Dim dString As New StringBuilder
        dString.Append("<table border=""1"" cellpadding=""0"" cellspacing=""0"">")
        dString.Append(GetHeader(inTable))
        dString.Append(GetBody(inTable))
        dString.Append("</table>")
        Return dString.ToString
    End Function

    Private Function GetHeader(ByVal dTable As DataTable) As String
        Dim dString As New StringBuilder

        dString.Append("<thead><tr>")
        For Each dColumn As DataColumn In dTable.Columns
            dString.AppendFormat("<th>{0}</th>", dColumn.ColumnName)
        Next
        dString.Append("</tr></thead>")

        Return dString.ToString
    End Function

    Private Function GetBody(ByVal dTable As DataTable) As String
        Dim dString As New StringBuilder

        dString.Append("<tbody>")

        For Each dRow As DataRow In dTable.Rows
            dString.Append("<tr>")
            For dCount As Integer = 0 To dTable.Columns.Count - 1
                dString.AppendFormat("<td td align='center'>{0}</td>", dRow(dCount))
            Next
            dString.Append("</tr>")
        Next
        dString.Append("</tbody>")

        Return dString.ToString()
    End Function

您可以通过在组中使用WITH ROLLUP。此外,您还可以在其中加入一个分组来标记总数

Select 
CASE WHEN GROUPING(Location) = 1 THEN 'Total' ELSE CAST(location AS VARCHAR(2)) END AS location
, SUM(net_sales) AS net_sales
, SUM(total_visits) AS total_visits
, CAST(AVG(Avg_money_per_visit) AS DECIMAL(10,2)) AS avg_money_per_visit
from Daily_Sales
where day = @day
Group By Location WITH ROLLUP

假设“Location”是一个varchar字段,您可以将total字段附加到基本查询中,以从数据库本身返回总和:

--<<Original Query>>
UNION ALL
SELECT 
    'Total:'
    , sum(net_sales)
    , sum(total_visits)
    , sum(Avg_money_per_visit)
from
    Daily_Sales

在不使用GROUP BY的情况下,将所有查询合并到同一个查询。这不需要我将其余的select列添加到GROUP BY子句中吗?至少看起来是这样me@Shmewnix不,但是如果你想精确计算平均货币的话,十进制是行不通的。这将是:CASTROUNDCASTSUMavg_money_per_Visition作为数字10,2/COUNTavg_money_per_Visition,2作为数字10,2作为avg_money_per_Visition。平均数是:48.33而不是48。有些人可能想要一分钱:有趣——谢谢,我会试试的。另一个问题-如果执行由子查询组成的查询,这种情况会发生什么变化?汇总是否仍然与此相同?