Высветліце агульны дзень продажу заснаваныя на той жа дзень

У мяне ёсць наступныя дадзеныя ў маёй продажу табліцы:

   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

Я хачу дадаць яшчэ адзін слупок «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  

Ці можна гэта зрабіць? дзякуй

1
Чаму існуюць два рады на тую ж дату? Як гэта разыходжанне?
дададзена аўтар hims056, крыніца
Чаму існуюць два рады на тую ж дату? Як гэта разыходжанне?
дададзена аўтар hims056, крыніца
Ці з'яўляецца Total_Sale слупок ў базавай табліцы, ці нешта разлічыць ў запыце? Спачатку вы паказаць яго ў табліцы, але затым у запыце ён разлічваецца.
дададзена аўтар Thomas Padron-McCarthy, крыніца
Ці з'яўляецца Total_Sale слупок ў базавай табліцы, ці нешта разлічыць ў запыце? Спачатку вы паказаць яго ў табліцы, але затым у запыце ён разлічваецца.
дададзена аўтар Thomas Padron-McCarthy, крыніца

9 адказы

Вы можаце зрабіць гэта ў карэлявалі подзапросов,

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

using 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

У якасці савета, імя параметру павінна адрознівацца ад імя слупка.

2
дададзена
Дзякуй за ваш адказ, SQLFiddle Demo вельмі карысна
дададзена аўтар Howard Hee, крыніца

Вы можаце зрабіць гэта ў карэлявалі подзапросов,

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

using 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

У якасці савета, імя параметру павінна адрознівацца ад імя слупка.

2
дададзена
Дзякуй за ваш адказ, SQLFiddle Demo вельмі карысна
дададзена аўтар Howard Hee, крыніца

Не захоўвайце яго, але выкарыстаць ўяўленне замест гэтага, а затым далучыцца да табліцы з выглядам. Калі вы карыстаецеся 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;

Калі вам трэба вельмі высокую прадукцыйнасць чытання, вам можа спатрэбіцца, каб матэрыялізаваць ўяўленне. Але пачнем з гэтага.

1
дададзена

Я думаю, што самы просты спосаб складаецца ў выкарыстанні функцыі сум() па PARTITION BY пункта.

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)

Hope this helps! (P.S.-> As I have used INT as the datatype for my temp table hence the zeroes after decimal are gone. This query will work for you as your base data is already decimal/float I assume.

1
дададзена
Дзякуй вы вельмі шмат, яна працуе вельмі добра.
дададзена аўтар Howard Hee, крыніца
PARTITION BY і ORDER BY пунктам было вялікім падмогай ў такіх сцэнарах, могуць быць выкарыстаны разам з SUM (), DENSE_RANK() і г.д., каб атрымаць некаторыя даволі прахалодныя вынікі.
дададзена аўтар S.A, крыніца

Я думаю, што самы просты спосаб складаецца ў выкарыстанні функцыі сум() па PARTITION BY пункта.

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)

Hope this helps! (P.S.-> As I have used INT as the datatype for my temp table hence the zeroes after decimal are gone. This query will work for you as your base data is already decimal/float I assume.

1
дададзена
Дзякуй вы вельмі шмат, яна працуе вельмі добра.
дададзена аўтар Howard Hee, крыніца
PARTITION BY і ORDER BY пунктам было вялікім падмогай ў такіх сцэнарах, могуць быць выкарыстаны разам з SUM (), DENSE_RANK() і г.д., каб атрымаць некаторыя даволі прахалодныя вынікі.
дададзена аўтар S.A, крыніца

Вы, верагодна, не хочаце, каб змяніць ваш стол такім чынам. Гэта можа запатрабаваць ад вас абнавіць кожны запіс на кожны дзень кожны раз, калі новы запіс была занесеная ў гэты дзень - каб захаваць новы агульны вынік. Я хацеў бы выкарыстаць іншую табліцу для захоўвання штодзённых агульнай складанасці, якія патрабуюць толькі адно абнаўлення кожны раз, калі вы дадаеце новы штодзённы ўваход:

Date       | Total Sale
2013-05-01 | 480.00
0
дададзена

Вы, верагодна, не хочаце, каб змяніць ваш стол такім чынам. Гэта можа запатрабаваць ад вас абнавіць кожны запіс на кожны дзень кожны раз, калі новы запіс была занесеная ў гэты дзень - каб захаваць новы агульны вынік. Я хацеў бы выкарыстаць іншую табліцу для захоўвання штодзённых агульнай складанасці, якія патрабуюць толькі адно абнаўлення кожны раз, калі вы дадаеце новы штодзённы ўваход:

Date       | Total Sale
2013-05-01 | 480.00
0
дададзена

Вы можаце вырашыць гэтую праблему з дапамогай трыгераў. Кожны раз, калі новае значэнне ўводзіцца, трыгер дадае гэта значэнне да Total_Day_Sale. Што такое база дадзеных?

0
дададзена

Вы можаце вырашыць гэтую праблему з дапамогай трыгераў. Кожны раз, калі новае значэнне ўводзіцца, трыгер дадае гэта значэнне да Total_Day_Sale. Што такое база дадзеных?

0
дададзена