【问题标题】:SQL - Getting Sum of all month payable while having a WHERE on monthsSQL - 在月份有 WHERE 时获取所有月份的应付总和
【发布时间】:2014-04-03 13:31:14
【问题描述】:

已编辑:感谢大家的回复,但似乎一切都脱离了上下文。我的错,我应该详细说明。

查询是针对Master-Child reportviewer(后端的SQL Server 2008 R2);其中 delvoucher 与 dvdetails 表具有 1:m 关系。该报告实际上是一张发票,在顶部(列表)显示cient_title和deliverydate等,并在内部tablix(主子报告场景)中显示交付细节。在底部,我显示所选月份的所有应付金额的总和。 (月份是通过放置在相同表单中的日期时间选择器选择的,该表单还包含我的 reportviewer 控件并刷新所选值更改的报告)。但是,我想得到自客户开始以来的总应付额减去本月的金额,即应付余额)。我应该使用 UNION 吗?并运行单独的查询以获取 SUM(amount) 而无需应用 WHERE month is blah blah。

总体问题是我必须显示拖欠 (sum(payable) - sum(paid)) 支付的金额是从另一个表中获得的 : 编辑关闭

我的查询

SELECT        
    delvoucher.dvdate, 
    delvoucher.dvno, 
    delvoucher.vehicleno, 
    delvoucher.salesman, 
    dvdetails.[desc], 
    dvdetails.supply, 
    dvdetails.empty, 
    dvdetails.amount, 
    dvdetails.rate, 
    delvoucher.title, 
    customer.currentaddress, 
    customer.phone, 
    customer.code
FROM         
    delvoucher 
    INNER JOIN dvdetails ON delvoucher.id = dvdetails.pid 
    INNER JOIN customer ON delvoucher.title = customer.title
WHERE        
    YEAR(delvoucher.dvdate) = YEAR(@i) 
    AND MONTH(delvoucher.dvdate) = MONTH(@i)

我想要的只是检索 SUM(dvdetails.amount),例如

SELECT        
    SUM(dvdetails.amount) , 
    delvoucher.dvdate, 
    delvoucher.dvno, ............

这可能很简单,但它给了我错误。我哪里错了

【问题讨论】:

  • 是哪个数据库系统?
  • 旁注:您可能需要考虑使用delvoucher.dvdate >= @startofmonth AND delvoucher.dvdate < DATEADD(month,1,@startofmonth) 进行搜索。对于更大的数据集,这至少让服务器有机会使用delvoucher.dvdate 的索引来定位所需的数据。您当前的样式意味着必须扫描整个表才能找到匹配的行。

标签: sql sql-server


【解决方案1】:

您可以使用GROUP BY 语句和SUM() 来制作这样的每月摘要:

SELECT 
    SUM(dvdetails.amount), 
    YEAR(delvoucher.dvdate), 
    MONTH(delvoucher.dvdate) 
FROM
    delvoucher 
    INNER JOIN dvdetails ON delvoucher.id = dvdetails.pid 
    INNER JOIN customer ON delvoucher.title = customer.title
WHERE
    YEAR(delvoucher.dvdate) = YEAR(@i) 
    AND MONTH(delvoucher.dvdate) = MONTH(@i)
GROUP BY 
    YEAR(delvoucher.dvdate), 
    MONTH(delvoucher.dvdate)

您可以在此处阅读相关问题: SQL query to retrieve SUM in various DATE ranges

GOUP BY 的文档在这里: http://www.w3schools.com/sql/sql_groupby.asp

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    @naota 有正确的答案,但如果您正在寻找这样的选择,即返回所有的 delvoucher 行:

    SELECT        
        SUM(dvdetails.amount) , 
        delvoucher.dvdate, 
        delvoucher.dvno, ............
    

    而不是

    SELECT 
        AmountSum = SUM(dvdetails.amount),
        Year = YEAR(delvoucher.dvdate),
        Month = MONTH(delvoucher.dvdate)
    

    那么您的查询可能看起来像这样(未经测试)

    SELECT        
        totals.AmountSum,
        delvoucher.dvdate, 
        delvoucher.dvno, 
        delvoucher.vehicleno, 
        delvoucher.salesman, 
        dvdetails.[desc], 
        dvdetails.supply, 
        dvdetails.empty, 
        dvdetails.amount, 
        dvdetails.rate, 
        delvoucher.title, 
        customer.currentaddress, 
        customer.phone, 
        customer.code
    FROM         
        delvoucher 
        INNER JOIN dvdetails ON delvoucher.id = dvdetails.pid 
        INNER JOIN customer ON delvoucher.title = customer.title
        INNER JOIN (   
            SELECT 
                AmountSum = SUM(dvdetails.amount),
                Year = YEAR(delvoucher.dvdate),
                Month = MONTH(delvoucher.dvdate) 
            FROM
                delvoucher 
                INNER JOIN dvdetails ON delvoucher.id = dvdetails.pid 
                INNER JOIN customer ON delvoucher.title = customer.title
            WHERE
                YEAR(delvoucher.dvdate) = YEAR(@i) 
                AND MONTH(delvoucher.dvdate) = MONTH(@i)
            GROUP BY 
                YEAR(delvoucher.dvdate), 
                MONTH(delvoucher.dvdate)
        ) totals ON totals.Year = YEAR(delvoucher.dvdate) AND totals.Month = MONTH(delvoucher.dvdate)
    WHERE        
        YEAR(delvoucher.dvdate) = YEAR(@i) 
        AND MONTH(delvoucher.dvdate) = MONTH(@i)
    

    基本上你的查询内部加入@naota 的查询加入年份和月份

    【讨论】:

    • 谢谢,但我想要的只是 SUM(amount) 没有应用 WHERE(没有特定月份,而是全部)您的查询总结了所有客户的(金额)并针对每个列显示,无论它是哪个客户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多