Sql 小计和总计列

Sql 小计和总计列,sql,case,visual-foxpro,foxpro,subtotal,Sql,Case,Visual Foxpro,Foxpro,Subtotal,在VisualFoxpro9中,我试图编写一个包含产品小计列和报告合计列的sql。 工作的sql代码如下所示,但是当我插入注释掉的案例代码时,我得到的错误似乎随着我纠正前面的错误而增加。 有人能告诉我应该把箱子放在哪个地方吗?代码有什么问题吗 SELECT qItemSaleLines.ItemID, ; qItems.ItemID, ; qItemSaleLines.SaleID, ; qSales.SaleID, ; qSales.CardRecordID, ; qCustomers.Car

在VisualFoxpro9中,我试图编写一个包含产品小计列和报告合计列的sql。 工作的sql代码如下所示,但是当我插入注释掉的案例代码时,我得到的错误似乎随着我纠正前面的错误而增加。 有人能告诉我应该把箱子放在哪个地方吗?代码有什么问题吗

SELECT qItemSaleLines.ItemID, ;
qItems.ItemID, ;
qItemSaleLines.SaleID, ;
qSales.SaleID, ;
qSales.CardRecordID, ;
qCustomers.CardRecordID, ;
qItems.ItemNumber AS ProdCODE, ;
qItems.ItemName AS StkNAME, ;
qCustomers.LastName AS CUSTOMER, ;
qSales.InvoiceNumber AS SaleINVNo,  ;
qSales.InvoiceDate AS SaleDATE, ;
qItemSaleLines.Quantity AS SaleQTY, ;
qItemSaleLines.TaxExclusiveTotal AS SALE, ;
qItemSaleLines.CostOfGoodsSoldAmount AS COGS, ; 
qItemSaleLines.TaxExclusiveTotal - qItemSaleLines.CostOfGoodsSoldAmount AS MARGIN, ;
(qItemSaleLines.TaxExclusiveTotal - qItemSaleLines.CostOfGoodsSoldAmount) *  /        qItemSaleLines.TaxExclusiveTotal AS MPERCENT ;
FROM qItemSaleLines, qItems, qSales, qCustomers ; 
WHERE qSales.CardRecordID = qCustomers.CardRecordID AND qItemSaleLines.SaleID =    qSales.SaleID AND ;
qItemSaleLines.ItemID = qItems.ItemID AND qSales.InvoiceDate > {^2009-06-30} ;
ORDER BY qItems.ItemNumber, qSales.InvoiceDate ;


*!* (SELECT qItems.ItemID, qItemSaleLines.ItemID, qItemSaleLines.TaxExclusiveTotal, ; 
*!*         CASE WHEN qItems.ItemID = (SELECT TOP 1 qItems.ItemID FROM   qItems.ItemID, ;
*!*             WHERE qItems.ItemID = qItemSaleLines.ItemID, ;
*!*             ORDER BY qItems.ItemID desc), ;
*!*         THEN (SELECT SUM(qItemSaleLines.TaxExclusiveTotal) FROM qItemSaleLines.TaxExclusiveTotal,; 
*!*             WHERE qItems.ItemID <= qItemSaleLines.ItemID AND qItems.ItemID = qItemSaleLines.ItemID, ; 
*!*         ELSE ' ' END AS 'PROD-SALE'), ;
*!*     CASE WHEN qItems.ItemID = (SELECT TOP 1 qItems.ItemID FROM qItems.ItemID, ; 
*!*             ORDER BY qItems.ItemID desc), ;
*!*     THEN (SELECT SUM(qItemSaleLines.TaxExclusiveTotal) FROM qItemSaleLines.TaxExclusiveTotal, ;
*!*         ELSE ' ' END AS 'Grand Total') ;

首先,VFP不支持在字段级别构造时的情况。此外,字段级别的子选择在from表之后、where之前以及where子句之后、order之前都有逗号。。。比如

select * from MyTable, where SomeCondition, Order by ...
如果执行VFP报告,则不必手动将组中的行添加到原始数据中,这应该通过datagrouping在报告本身中完成,并添加ItemID作为组的基础。然后将可求和列复制/粘贴到每个项目报告的组页脚栏中。双击字段,对于计算,告诉它求和,并在每个组的末尾重置,即:ItemID。然后,包括一个报告摘要栏。整个报告只打印一次。。。与项目级别的摘要项目一样,再次复制/粘贴,但将其放入报告摘要栏中。双击这些元素以在报告末尾求和并重置

但是,由于您运行的是VFP9,并且您可能希望转储数据,其中的行已经包含在各自的位置中,因此我将打断单独的查询,并将结果合并在一起,正如我在下面采样的那样。预提取报告数据的行项目支持,而无需任何必要的聚合

SELECT ;
        qItemSaleLines.ItemID, ; 
        qItemSaleLines.SaleID, ; 
        qCustomers.CardRecordID, ; 
        qItems.ItemNumber AS ProdCODE, ; 
        qItems.ItemName AS StkNAME, ; 
        qCustomers.LastName AS CUSTOMER, ; 
        qSales.InvoiceNumber AS SaleINVNo,  ; 
        qSales.InvoiceDate AS SaleDATE, ; 
        qItemSaleLines.Quantity AS SaleQTY, ; 
        qItemSaleLines.TaxExclusiveTotal AS SALE, ; 
        qItemSaleLines.CostOfGoodsSoldAmount AS COGS, ;  
        qItemSaleLines.TaxExclusiveTotal - qItemSaleLines.CostOfGoodsSoldAmount AS MARGIN, ; 
        (qItemSaleLines.TaxExclusiveTotal - qItemSaleLines.CostOfGoodsSoldAmount) / qItemSaleLines.TaxExclusiveTotal AS MPERCENT, ;
        "1" as TierLevel,;
        "1" as SubTier,;
        SPACE(50) as GroupCaption; 
    FROM ;
        qSales, ;
        qCustomers, ;  
        qItemSaleLines, ;
        qItems, ;
    WHERE ;
            qSales.CardRecordID = qCustomers.CardRecordID ;
        AND qSales.SaleID = qItemSaleLines.SaleID ;
        AND qItemSaleLines.ItemID = qItems.ItemID ;
        AND qSales.InvoiceDate > {^2009-06-30} ; 
    ORDER BY ;
        qItems.ItemNumber, ;
        qSales.InvoiceDate ; 
    INTO ;
        CURSOR C_TmpAllLineItemResults READWRITE 

*/ NOW, get your individual "ITEM GROUP" totals from ABOVE results...
SELECT ;
        TR.ItemID, ; 
        TR.ItemNumber AS ProdCODE, ; 
        TR.ItemName AS StkNAME, ; 
        "1" as TierLevel,;
        "2" as SubTier,;
        "Subtotal by " + TR.ItemNumber as GroupCaption; 
        SUM( TR.SaleQty ) as SaleQty,;
        SUM( TR.Sale ) as Sale,;
    FROM ;
        C_TmpAllLineItemResults TR;
    GROUP BY ;
        1, 2, 3, 4, 5, 6;
    ORDER BY ;
        1;
    INTO ;
        CURSOR C_SubTotalPerItem READWRITE 


*/ NOW, get your REPORT totals from ABOVE results...
SELECT ;
        "2" as TierLevel,;
        "Report Totals " as GroupCaption; 
        SUM( STBI.SaleQty ) as SaleQty,;
        SUM( STBI.Sale ) as Sale,;
    FROM ;
        C_SubTotalPerItem STBI;
    GROUP BY ;
        1, 2;
    INTO ;
        CURSOR C_ReportTotals READWRITE 

*/ Finally, merge them together... since the append from will add records with matching columns,
*/ even though a subtotal cursor doesn't have all the same columns, VFP doesn't care, just 
*/ adds for columns that DO match the table its going into.
SELECT C_TmpAllLineItemResults
APPEND FROM DBF( "C_SubTotalPerItem" )
APPEND FROM DBF( "C_ReportTotals" )

*/ Now, they are all merged... Finally, build an index for your report
INDEX on TierLevel + ItemID + SubTier TAG RptOrder

*/ Now, browse / review the order and adjust as needed...

此外,如果您只想将总计作为表中的列,可以执行以下操作

select ;
       Tbl.YourColumns,;
       PerItem.TotalPerItem,;
       RptTotal.TotalPerAll;
   from ;
       YourOtherTables Tbl,;
       ( select YourSalesTable.ItemID,;
                sum( CalculatedSales ) as TotalPerItem;
             From;
                YourSalesTable;
             Group by ;
                ItemID ) PerItem,;
       ( select sum( CalculatedSales ) as TotalPerAll;
             From ;
                YourTalesTable ) RptTotal;
   where ;
       YourOtherJoinConditions;
      AND YourOtherTables.ItemID = PerItem.ItemID;
   order by ;
       whatever;
   into ;
       cursor YourReportResults
通过执行SQL Select作为最后两个表,按itemID分组将创建每个表项的总数。通过将final where连接到别名PerItem的ItemID,您将得到列总数。但是,由于别名RPTOTAL上没有联接,因此将得到笛卡尔联接。。。但由于其始终为1记录,因此每一行的值都将与其TotalAll列的值相同


我希望这两种解决方案能够满足您的需要。

Drapp,非常感谢您对SQL的帮助。我在哪里都找不到。塔斯曼:是的,但是他们中有一个为你工作吗。。。对于您的声誉分数,最好选择验收认可解决方案旁边的复选标记。名声不好的人可能不会提供帮助。仅供论坛参考…对不起,德拉普,我对这一点非常陌生,仍在努力找出如何将其放入我的sql中,因此在这个阶段不知道哪一个会起作用。我想我可能需要填鸭式的学习。我想实现的是在一个单独的列中显示每个ItemID的所有单独行,并对这组行进行小计,但我担心我还不具备这样做的知识。嗨,塔斯曼,如果您在VFP工作,并且希望获得您评论的其他填鸭式帮助,让我直接知道。。。drapp@dvrss.com