您好,我正在尝试创建一个自动查询,该查询显示日期,月份,日期和星期,并为每个字段创建一列。如果生产日期是最大值-存款的最小生产日期总和,我需要对余额进行总计。这将给我一个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];
这将导致如下图所示:
总的来说,我需要计算出年初至今的日期,即减去我拥有的最大日期减去我拥有的最小日期。稍后,当我导入更多数据时,我需要执行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,列的名称与图片中的名称相同。再次谢谢你
答案 0 :(得分:0)
这应该使您对如何获得这些总数有所了解。我不知道您的表中还需要其他什么数据,但是您应该可以修改以下查询以获取该数据。
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总数。