2013-05-29 8 views
-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 

Я хочу добавить еще один столбец «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 

Возможно ли это? Благодаря

+0

Почему существуют две строки на ту же дату? Каковы эти расхождения? – hims056

+0

Является ли Total_Sale столбцом в базовой таблице или чем-то, что вы вычисляете в запросе? Сначала вы показываете его в таблице, но затем в запросе рассчитывается. –

ответ

1

Я думаю, что самый простой способ - использовать SUM() над пунктом 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) 

Надеется, что это помогает! (PS-> Так как я использовал INT в качестве типа данных для моей временной таблицы, значит, нули после десятичной деления исчезли.Этот запрос будет работать для вас, поскольку ваши базовые данные уже десятичные/поплавковые, я предполагаю.

+0

Спасибо вам большое, он работает очень хорошо. –

+0

Предложение PARTITION BY и ORDER BY оказало большую помощь в таких сценариях, может использоваться вместе с SUM(), DENSE_RANK() и т. Д., Чтобы получить некоторые довольно крутые результаты. –

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 

В качестве совета имя параметра должно отличаться от имени столбца.

+0

Спасибо за ваш ответ , SQLFiddle Demo очень полезно –

0

Вы можете решить эту проблему, используя триггеры. Всякий раз, когда вводится новое значение, триггер добавляет его значение к Total_Day_Sale. Что это за база данных?

0

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

Date  | Total Sale 
2013-05-01 | 480.00 
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; 

Если вам нужно очень высокую производительность чтения, вам может понадобиться, чтобы материализовать представление. Но начните с этого.

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