开始日期和结束日期之间每个项目的 MS SQL Server QUERY SUM
Posted
技术标签:
【中文标题】开始日期和结束日期之间每个项目的 MS SQL Server QUERY SUM【英文标题】:MS SQL Server QUERY SUM of each item between start date and end date 【发布时间】:2017-02-12 20:57:18 【问题描述】:我有一个表“pay_schedule”,如下所示:
-------------------------------------------------- ---------------------------- 标题 (char[50]) | FilmId (int) payout (Dec(18,2)) pay_date (date) | -------------------------------------------------- ----------------------------------------| 大秘密 | -2147483648 | 900.00 | 2017 年 4 月 9 日 | 不解 | -2147483631 | 512.50 | 2017 年 4 月 9 日 | 不解 | -2147483631 | 325.94 | 2017 年 4 月 9 日 | 不解 | -2147483631 | 325.94 | 2017 年 7 月 9 日 | 明星男装 | -2147483639 | 512.5 | 2017 年 7 月 9 日 | 深处 | -2147483636 | 900 | 2017 年 7 月 9 日 | 深处 | -2147483636 | 900 | 2017 年 10 月 9 日 | 深处 | -2147483636 | 512.5 | 2017 年 10 月 9 日 | 深处 | -2147483636 | 325.94 | 2017 年 10 月 9 日 | 不解 | -2147483631 | 325.94 | 2018 年 1 月 9 日 | 明星 | -2147483639 | 512.5 | 2018 年 1 月 9 日 | 不解 | -2147483639 | 900 | 2018 年 1 月 9 日 | 米尔扎 | -2147483639 | 900 | 2018 年 4 月 9 日 | 不解 | -2147483639 | 512.5 | 2018 年 4 月 9 日 | ..... | .......... | ...... | ..... | | | | |我想得到一个结果:
每月每个标题的总和(支付) 在开始日期和结束日期之间每月的总支出。如下图所示: 开始日期:01/01/2017 结束日期:12/31/2019 -------------------------------------------------- ---------------------- Y 月 |大秘密 |深藏不露 |不解 |明星男 | | | | | | -------------------------------------------------- ----------------------| 2017 年 4 月 | 900.00 | 0.00 | 838.44 | 0.00 | 2017 年 7 月 | 0.00 | 900.00 | 325.94 | 512.50 | 2017 年 10 月 | 0.00 | 1738.44 | 0.00 | 0.00 | 2018 年 1 月 | 0.00 | 0.00 | 1225.94 | 512.50 | 2018 年 4 月 | 900.00 | | 512.50 | | _______________________________________________________________** 没有付款的月份不包括在内
非常感谢您的宝贵时间和帮助。由于这是一个大表,如果您也指出可能的优化,我将不胜感激。祝你有美好的一天!
【问题讨论】:
除了示例中显示的 4 个标题之外,您还能拥有更多标题吗? @vkp 是的,可能在 100 秒内,唯一的限制是开始日期和结束日期,或者可能将其分解为 20 个左右的标题。 感谢 @Joel Coehoom 和 Happy Town 进行格式编辑。我觉得很傻,但还是不怎么!还是谢谢。 对于答案...看看 PIVOT 关键字。但即使使用此关键字,您仍然必须在编写查询时能够知道结果中预期的列的数量和名称,或者您'将被卡住使用动态 sql。 【参考方案1】:如果您将结果集格式化为file
和month
,并带有支出,那么您可以只使用聚合:
select title, year(paydate) as yyyy, month(paydate) as mm,
sum(payout)
from pay_schedule
group by title, year(paydate), month(paydate)
order by title, yyyy, mm;
如果您有很多行,您甚至可能无法根据需要重组数据。这可能意味着大量列和超过一千个左右超出 SQL Server 限制。
如果您仍想走这条路,谷歌“动态枢轴 SQL Server”。
【讨论】:
谢谢戈登。将检查动态数据透视 SQL Server。【参考方案2】:试试这个:
CREATE TABLE #tt(Title CHAR(50),FilmId INT,payout DECIMAL(18,2),pay_date DATE)
INSERT INTO #tt
SELECT 'Big Secret',-2147483648,900.00,'4/9/2017' UNION ALL
SELECT 'puzzled',-2147483631,512.50,'4/9/2017' UNION ALL
SELECT 'puzzled',-2147483631,325.94,'4/9/2017' UNION ALL
SELECT 'puzzled',-2147483631,325.94,'7/9/2017' UNION ALL
SELECT 'Star men',-2147483639,512.5 ,'7/9/2017' UNION ALL
SELECT 'Deep beneath',-2147483636,900,'7/9/2017' UNION ALL
SELECT 'Deep beneath',-2147483636,900,'10/9/2017' UNION ALL
SELECT 'Deep beneath',-2147483636,512.5 ,'10/9/2017' UNION ALL
SELECT 'Deep beneath',-2147483636,325.94,'10/9/2017' UNION ALL
SELECT 'puzzled',-2147483631,325.94,'1/9/2018' UNION ALL
SELECT 'Star ment',-2147483639,512.5 ,'1/9/2018 ' UNION ALL
SELECT 'puzzled',-2147483639,900,'1/9/2018' UNION ALL
SELECT 'Mirzya',-2147483639,900,'4/9/2018' UNION ALL
SELECT 'puzzled',-2147483639,512.5,'4/9/2018 '
SELECT @col1=ISNULL(@col1+',','')+QUOTENAME(RTRIM(Title)),@col2=ISNULL(@col2,'')+',ISNULL('+QUOTENAME(RTRIM(Title))+',0) AS '+QUOTENAME(RTRIM(Title)) FROM #tt GROUP BY RTRIM(Title)
PRINT @col2
SET @sql='SELECT LEFT(mon,3)+'' ''+LTRIM(yr) as [Month Y]'+@col2+' FROM ('+CHAR(13)+
' SELECT DATENAME(MONTH,pay_date) AS mon ,YEAR(pay_date) AS yr,RTRIM(Title) AS Title,SUM(payout) AS payout FROM #tt'+CHAR(13)+
' GROUP BY DATENAME(MONTH,pay_date) ,YEAR(pay_date),RTRIM(Title)'+CHAR(13)+
') AS t '+CHAR(13)+
'PIVOT(MAX(payout) FOR Title IN ('+@col1+')) p'
EXEC(@sql)
Y 月 大秘密 深藏在密尔兹亚的疑惑中 明星男装 明星 ment
-------------------------------------------------- ----- ---------------------------------------------------- ------ --------------------------------- ----------------- ---------------------- ---------------------------- ------------ ---------------------------------------
2017 年 4 月 900.00 0.00 0.00 838.44 0.00 0.00
2017 年 7 月 0.00 900.00 0.00 325.94 512.50 0.00
2017 年 10 月 0.00 1738.44 0.00 0.00 0.00 0.00
2018 年 4 月 0.00 0.00 900.00 512.50 0.00 0.00
2018 年 1 月 0.00 0.00 0.00 1225.94 0.00 512.50
【讨论】:
太棒了!谢谢@Nolan Shang。这对我有用。将考虑 Gordon Linoff 和 Joel Coehoom 关于大量列的潜在危险的警告。谢谢大家。以上是关于开始日期和结束日期之间每个项目的 MS SQL Server QUERY SUM的主要内容,如果未能解决你的问题,请参考以下文章
sql server 中两个日期之间的年份以及每个日期在 sql server 中的开始和结束日期
SQL 'overlaps' 仅获取开始和结束之间的日期(不包括开始和结束日期)