开始日期和结束日期之间每个项目的 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】:

如果您将结果集格式化为filemonth,并带有支出,那么您可以只使用聚合:

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 中的开始和结束日期

ms-sql 如何查询开始时间与结束时间之间的数据?

SQL 'overlaps' 仅获取开始和结束之间的日期(不包括开始和结束日期)

如何为开始日期和结束日期之间的每个工作日创建多行

如果日期列介于开始日期和结束日期之间,则选择行 FMDB 请求

Postgresql 查询以展开每个客户的开始日期和结束日期之间的所有日期