我有一个查询可以获取当天的各种日常统计数据。使用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.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? – jarlh
你真的应该在你的显示层中做大部分显示内容(无论你的前端是什么)。 –
我正在使用vb。净 - 但是,我将数据集转换为HTML表格,并通过电子邮件发送出去。在中间添加它并不是一个好的选择。 – Shmewnix