繁体   English   中英

SQL - 在月份有WHERE时获得所有月份的总和

[英]SQL - Getting Sum of all month payable while having a WHERE on months

编辑:谢谢大家的回复,但似乎一切都脱离了背景。 我的错,我应该了解更多细节。

该查询适用于Master-Child reportviewer(后端的SQL Server 2008 R2); 其中delvoucher与dvdetails表的关系为1:m。 该报告实际上是一张发票,在顶部(列表)上显示cient_title和deliverydate等,并在内部Tablix中显示交付详情(Master-Child报告方案)。 在底部,我显示所选月份的所有应付金额的总和。 (通过日期时间选择器选择月份,该日期时间选择器以相同的形式放置,同时包含我的reportviewer控件并刷新有关所选值更改的报告)。 但是,我希望从客户开始减去本月金额(即应付余额)后得到应付总额。 我要用UNION吗? 并运行一个单独的查询来获得SUM(金额)而不应用WHERE月是等等等等。

整体问题是我必须显示欠款(总和(应付款) - 总和(已付款)),其中付款金额将从另一张表中获得:编辑关闭

我的查询

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, ............

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

您可以将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查询以在各种DATE范围内检索SUM

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

希望这可以帮助。

@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的查询加入年和月

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM