根据最大生产日期和最小生产日期的总和MTD,WTD,YTD SQL Server

时间:2018-07-06 15:32:18

标签: sql sql-server query-help

您好,我正在尝试创建一个自动查询,该查询显示日期,月份,日期和星期,并为每个字段创建一列。如果生产日期是最大值-存款的最小生产日期总和,我需要对余额进行总计。这将给我一个YTD列。如果有人有任何想法,我还需要每月进行一次,每周进行一次。任何帮助,将不胜感激。谢谢!

P.S。我正在使用Microsoft SQL Server Management Studio 这是我到目前为止的内容:

select SUM([curr_bal_amt]) as total_amt , [prod_dt] as date123
from [dbo].[DEPOSIT_TEST]
group by [prod_dt];

这将导致如下图所示:

enter image description here

总的来说,我需要计算出年初至今的日期,即减去我拥有的最大日期减去我拥有的最小日期。稍后,当我导入更多数据时,我需要执行mtd和wtd。谢谢

编辑:我希望使用当前表格,因此可能会有助于编辑该表格,因为我忘了提到我的数据有3天的间隔。

-对于prod_dt列,如果prod_dt相同,我必须加总多个余额。是否有一个简单的查询来仅减去curr_balance amt的最近日期的总和-上个月curr_balance amt的总和的第一个日期。感谢您对Shawn的帮助,非常感谢!

this is an example of one of my data imports for one of my days

如果您可以使用我的列的名称,那将非常有益,以便我可以更好地学习。谢谢!我的表的名称是Deposit_Test,列的名称与图片中的名称相同。再次谢谢你

1 个答案:

答案 0 :(得分:0)

这应该使您对如何获得这些总数有所了解。我不知道您的表中还需要其他什么数据,但是您应该可以修改以下查询以获取该数据。

SQL Fiddle

MS SQL Server 2017架构设置

/********************************CALENDAR********************************/
/* 
  My original answer made use of a Calendar Table, but I realized it 
  was overkill for this situation. I still think every database should
  have both a Calendar Table and a Numbers Table. They are both very 
  useful. I use the ct here just to populate my test table, but I've 
  left some very basic creation to show you how it can be done. Calcs 
  done here allow your final query to JOIN to it and avoid RBAR to be 
  more set-based, and save a lot of processing for large tables.  
  NOTE: This original date table concept is from Aaron Bertrand.
*/

CREATE TABLE datedim (
      theDate           date        PRIMARY KEY
    , theDay            AS DATEPART(day, theDate)           --int
    , theWeek           AS DATEPART(week, theDate)          --int 
    , theMonth          AS DATEPART(month, theDate)         --int
    , theYear           AS DATEPART(year, theDate)          --int
    , yyyymmdd          AS CONVERT(char(8), theDate, 112)   /* yyyymmdd */
);

/************************************************************************/
/* 
  Use the catalog views to generate as many rows as we need. This example
  creates a date dimension for all of 2018.
*/
INSERT INTO datedim ( theDate ) 
SELECT d
FROM (
    SELECT d = DATEADD(day, rn - 1, '20180101')
    FROM 
    (
        SELECT TOP (DATEDIFF(day, '20180101', '20190101')) 
            rn = ROW_NUMBER() OVER (ORDER BY s1.object_id)
        FROM sys.all_objects AS s1
        CROSS JOIN sys.all_objects AS s2
        ORDER BY s1.object_id
    ) AS x
) AS y;
/************************************************************************/

/***** TEST TABLE SETUP *****/
CREATE TABLE t1 ( id int identity, entryDate date, cnt int) ;

INSERT INTO t1 (entryDate, cnt)
SELECT theDate, 2
FROM datedim
;

/* Remove a few "random" records to test our counts. */
DELETE FROM t1 
WHERE datePart(day,entryDate) IN (10,6,14,22) OR datepart(month,entryDate) = 6
;

主要查询

/* Make sure the first day or our week is consistent. */
SET DATEFIRST 7 ; /* SUNDAY */ 

/* Then build out our query needs with CTEs. */
; WITH theDate AS (
  SELECT d.dt FROM ( VALUES ( '2018-05-17' ) ) d(dt) 
)
, base AS (
  SELECT t1.entryDate
    , t1.cnt
    , theDate.dt
    , datepart(year,theDate.dt) AS theYear
    , datepart(month,theDate.dt) AS theMonth
    , datepart(week,theDate.dt) AS theWeek
  FROM t1
  CROSS APPLY theDate
  WHERE t1.EntryDate <= theDate.dt
    AND datePart(year,t1.EntryDate) = datePart(year,theDate.dt)
)
/* Year-to-date totals */
, ytd AS ( 
  SELECT b.theYear, sum(cnt) AS s
  FROM base b
  GROUP BY b.theYear
)
/* Month-to-date totals */
, mtd AS (
  SELECT b2.theYear, b2.theMonth, sum(cnt) AS s
  FROM base b2
  WHERE b2.theMonth = datePart(month,b2.EntryDate)
  GROUP BY b2.theYear, b2.theMonth
)
/* Week-to-date totals */
, wtd AS (
  SELECT b3.theYear, b3.theMonth, sum(cnt) AS s
  FROM base b3
  WHERE b3.theWeek = datePart(week,b3.EntryDate)
  GROUP BY b3.theYear, b3.theMonth
)
SELECT blah = 'CountRow'
  , ytd.s AS ytdAmt
  , mtd.s AS mtdAmt
  , wtd.s AS wtdAmt
FROM ytd 
CROSS APPLY mtd
CROSS APPLY wtd 

Results

|     blah | ytdAmt | mtdAmt | wtdAmt |
|----------|--------|--------|--------|
| CountRow |    236 |     28 |      8 |

同样,您需要获取的数据可能会更改整个查询,但这应该指向正确的方向。您可以使用每个CTE来验证YTD,MTD和WTD总数。