2016-02-19 3 views
1

У меня есть SQL-запрос:Как Всего столбцы в строке

Select Location, net_sales, total_visits, Avg_money_per_visit 
from Daily_Sales 
where day = @day 
Group By Location 

Это работает в VB.NET и хранится в DataTable Оттуда, я преобразовать его в HTML и отправить как тело Эл. адрес.

Выход

Location  Net_Sales  Total Visits AVG Money Per Visit 
1    100    5     20    
2    50    2     25 
3    200    2     100 

То, что я хотел бы выход, чтобы посмотреть, как с Totals:

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 

Как я могу получить столбец суммы в любом SQL, или DataTable до преобразования в HTML.

Вот как я хочу преобразовать в 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 
+0

UNION ALL ваш запрос в том же запросе без ГРУППА ПО. –

ответ

0

Предполагая, что «Location» есть поле VARCHAR, вы можете добавить общее поле для базового запроса, чтобы вернуть сумму из самой БД:

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

Вы можете использовать WITH ROLLUP в вашей GROUP BY. Кроме того, вы можете бросить GROUPING() там, чтобы обозначить общее количество.

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 
+0

Разве это не потребовало бы, чтобы я добавил остальные столбцы выбора в предложение group by? По крайней мере, это похоже на меня – Shmewnix

+0

@Shmewnix нет, но если вам нужна точность для 'avg_money_per_visit' десятичной функции. Это будет: 'CAST (ROUND (CAST (SUM (avg_money_per_visit) AS ЧИСЛЕННЫЙ (10,2))/COUNT (avg_money_per_visit), 2) AS NUMERIC (10,2)) AS avg_money_per_visit'. Поскольку среднее значение: '48.33' не' 48'. Некоторые могут захотеть этого до *** penny *** :) – Codexer

+0

Интересно - Спасибо, я попробую. Другой вопрос: как это изменить, если вы выполняете запрос, состоящий из подзапросов? Поддерживает ли RollUP то же самое с этим? – Shmewnix

Смежные вопросы