-1

我的销售表中有以下数据:

   Staff_Code  | Tran_Date  |  Morning_Sale | Night_Sale | Total_Sale
       S01     | 2013-05-01 |     50.00     |   300.00   |  350.00
       S02     | 2013-05-01 |     10.00     |   70.00    |   80.00
       S01     | 2013-05-02 |     100.00    |   20.00    |  120.00

我想再添加 1 列“total_Day_Sale”来了解每日总销售额,格式如下表:

   Staff_Code  | Tran_Date  |  Morning_Sale | Night_Sale | Total_Sale | Total_Day_Sale
       S01     | 2013-05-01 |     50.00     |   300.00   |  350.00    |   430.00  
       S02     | 2013-05-01 |     10.00     |   70.00    |   80.00    |   430.00
       S01     | 2013-05-02 |     100.00    |   20.00    |  120.00    |   120.00

我正在尝试以下代码,但不是我预期的结果!

SELECT Tran_Date,Morning_Sale,Night_Sale,Morning_Sale + Night_Sale As 'Total_Sale', 
sum(Morning_Sale)+sum(Night_Sale ) As 'Total_Day_Sale' FROM Sale 
WHERE Tran_Date=Tran_Date  

有可能这样做吗?谢谢

4

5 回答 5

2

您可以在相关子查询中执行此操作,

SELECT  Tran_Date,
        Morning_Sale,
        Night_Sale,
        Morning_Sale + Night_Sale As 'Total_Sale', 
        (
            SELECT  SUM(Morning_Sale + Night_Sale)
            FROM    Sale b
            WHERE   a.Tran_Date = b.Tran_Date AND
                    b.Tran_Date = _Tran_Date
        )   As 'Total_Day_Sale' 
FROM    Sale a
WHERE   Tran_Date = _Tran_Date

使用JOIN

SELECT  a.Tran_Date,
        a.Morning_Sale,
        a.Night_Sale,
        a.Morning_Sale + a.Night_Sale As 'Total_Sale', 
        b.Total_Day_Sale
FROM    Sale a
        INNER JOIN
        (
            SELECT  Tran_Date, SUM(Morning_Sale + Night_Sale) Total_Day_Sale
            FROM    Sale 
            WHERE   Tran_Date = _Tran_Date
            GROUP   BY Tran_Date
        ) b   ON a.Tran_Date = b.Tran_Date
WHERE   a.Tran_Date = _Tran_Date

作为建议,参数名称应该与列的名称不同。

于 2013-05-29T04:44:28.740 回答
1

不要存储它,而是使用视图,然后将表与视图连接起来。如果您使用的是 SQL Server,则可以使用 CTE 而不是视图:

WITH DailyTotal AS
(SELECT Tran_Date, sum(Morning_Sale + Night_Sale) AS "Total_Day_Sale"
FROM Sale
GROUP BY Tran_Date)
SELECT Sale.Tran_Date, Morning_Sale, Night_Sale,
       Morning_Sale + Night_Sale As "Total_Sale", Total_Day_Sale
FROM Sale, DailyTotal
WHERE Sale.Tran_Date = DailyTotal.Tran_Date;

如果您需要非常高的读取性能,您可能需要物化视图。但是从这个开始。

于 2013-05-29T05:01:48.533 回答
1

我认为最简单的方法是在 PARTITION BY 子句上使用 SUM()。

SELECT Staff_Code,
        Tran_Date,
        Morning_Sale,
        Night_Sale,
        Total_Sale,
SUM(Total_Sale)  OVER (PARTITION BY Tran_Date) AS Total_Day_Sale
FROM #DailyTotals

输出:

Staff_Code Tran_Date  Morning_Sale Night_Sale  Total_Sale  Total_Day_Sale
---------- ---------- ------------ ----------- ----------- --------------
       S01 2013-05-01 50           300         350         430
       S02 2013-05-01 10           70          80          430
       S01 2013-05-02 100          20          120         120

(3 row(s) affected)

希望这可以帮助!(PS-> 因为我使用 INT 作为临时表的数据类型,因此小数点后的零消失了。这个查询对你有用,因为我假设你的基础数据已经是十进制/浮点数。

于 2013-05-29T05:56:05.310 回答
0

您可以通过使用触发器来解决此问题。每当输入新值时,触发器会将其值添加到 Total_Day_Sale。这个数据库是什么?

于 2013-05-29T04:45:03.977 回答
0

你可能不想那样改变你的桌子。每次输入当天的新条目时,您都需要更新每一天的每个条目 - 以存储新的总计。我会使用另一个表来存储每日总数,每当您添加新的每日条目时,只需要一次更新:

Date       | Total Sale
2013-05-01 | 480.00
于 2013-05-29T04:48:46.133 回答