【发布时间】:2016-06-04 04:29:23
【问题描述】:
我有一个查询可以提取当天的各种每日统计信息。
这是我的查询:
SELECT e.Location_Name AS Location, c.customers AS Customers, '$' + CONVERT(nvarchar, CAST(c.net_sales AS money), 1) AS Sales, '$' + CONVERT(nvarchar,
CAST(e.Ticket_Goal AS Decimal(10, 2))) AS [TKT Goal], '$' + CONVERT(nvarchar, c.Ticket_avg) AS TKT, CAST(d.Labor_Hours / c.customers AS Decimal(10, 2))
AS Labor, CONVERT(nvarchar, CAST(d.Labor_Dollars / c.net_sales * 100 AS Decimal(10, 1))) + '%' AS [%]
FROM (SELECT Store_Number, SUM(Net_Sales) AS net_sales, SUM(Customers ) AS Customers , CAST(SUM(Net_Sales) / SUM(Customers ) AS decimal(10, 2))
AS Ticket_avg
FROM daily_sales_tb AS a
WHERE (Operations_Day = DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0))
GROUP BY Store_Number) AS c INNER JOIN
(SELECT Store_Number, SUM(Labor_Hours) + SUM(Overtime_Labor_Hours) AS Labor_Hours, SUM(Labor_Dollars) + SUM(Overtime_Labor_Dollars)
AS Labor_Dollars
FROM daily_labor_tb AS b
WHERE (Operations_Day = DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0))
GROUP BY Store_Number) AS d ON c.Store_Number = d.Store_Number INNER JOIN
(SELECT Store_Number, Ticket_Goal, Location_Name
FROM dds.Location_Table_Info_Tb) AS e ON c.Store_Number = e.Store_Number
这是输出:
Location Customers Sales TKT Goal TKT Labor %
1 100 $1000 $9.00 $10 1.2 20%
2 200 $1500 $9.00 $7.50 1.3 15%
3 300 $2000 $9.00 $6.67 1.4 20%
4 100 $800 $9.00 $8 1.1 20%
这是我希望输出的样子(添加总行):
Location Customers Sales TKT Goal TKT Labor %
1 100 $1,000 $9.00 $10 1.2 20%
2 200 $1,500 $9.00 $7.50 1.3 15%
3 300 $2,000 $9.00 $6.67 1.4 20%
4 100 $800 $9.00 $8 1.1 20%
TOTAL: 900 $5,300 - $5.89 - -
我已尝试使用 Union All -
SELECT e.Location_Name AS Location, c.customers AS Customers, '$' + CONVERT(nvarchar, CAST(c.net_sales AS money), 1) AS Sales, '$' + CONVERT(nvarchar,
CAST(e.Ticket_Goal AS Decimal(10, 2))) AS [TKT Goal], '$' + CONVERT(nvarchar, c.Ticket_avg) AS TKT, CAST(d.Labor_Hours / c.customersAS Decimal(10, 2))
AS Labor, CONVERT(nvarchar, CAST(d.Labor_Dollars / c.net_sales * 100 AS Decimal(10, 1))) + '%' AS [%]
FROM (SELECT Store_Number, SUM(Net_Sales) AS net_sales, SUM(Customers ) AS Customers , CAST(SUM(Net_Sales) / SUM(Customers ) AS decimal(10, 2))
AS Ticket_avg
FROM daily_sales_tb AS a
WHERE (Operations_Day = DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0))
GROUP BY Store_Number) AS c INNER JOIN
(SELECT Store_Number, SUM(Labor_Hours) + SUM(Overtime_Labor_Hours) AS Labor_Hours, SUM(Labor_Dollars) + SUM(Overtime_Labor_Dollars)
AS Labor_Dollars
FROM daily_labor_tb AS b
WHERE (Operations_Day = DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0))
GROUP BY Store_Number) AS d ON c.Store_Number = d.Store_Number INNER JOIN
(SELECT Store_Number, Ticket_Goal, Location_Name
FROM dds.Location_Table_Info_Tb) AS e ON c.Store_Number = e.Store_Number
UNION ALL
select 'TOTAL:', SUM(Customers ), '$' + Convert(nvarchar,Cast(SUM (net_sales) as money),1), '-', Convert(nvarchar,CAST(SUM(Net_Sales) / SUM(Customers ) AS money)), '-', convert(nvarchar,'-')
from daily_sales_tb
当我运行这个查询时,我得到一个 SQL 错误:
Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting varchar to data type numeric.
如何解决这个问题以正确输出数据?
我在 vb.net 中运行此查询,填充数据集,然后将数据集转换为 HTML 表。转换完成后,我将表格作为电子邮件正文通过电子邮件发送。
【问题讨论】:
-
SQL Server 没有 ROLLUP 或类似的东西,可以用来代替 UNION ALL 吗?
-
您确实应该在显示层中完成大部分显示内容(无论您的前端是什么)。
-
我正在使用 vb.net - 但是,我正在将数据集转换为 HTML 表,并通过电子邮件发送出去。在两者之间添加它不是一个很好的选择。
-
该错误是因为您试图在第一列中混合数据类型。您需要将第一列转换为 varchar 才能正常工作。
标签: sql sql-server vb.net sql-server-2008 dataset