سؤال

في Visual Foxpro 9 أحاول كتابة SQL مع عمود منتج "نطاق فرعي" وعمود "إجمالي".
رمز SQL الذي يعمل كما يلي ، ولكن عندما أقوم بإدراج رمز "Case" الذي تم تعليقه ، أحصل على أخطاء يبدو أنها تزيد مع تصحيح الخطأ السابق.
هل يمكن لأي شخص أن يخبرني في أي مكان يجب أن أدخل فيه "الحالة" وما هو الخطأ في الكود؟

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') ;
هل كانت مفيدة؟

المحلول

بالإضافة إلى ذلك ، إذا كنت تريد فقط الإجماليات كأعمدة في الجدول ، فيمكنك فعل شيء مثل

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) سيقوم بإنشاء إجمالي لكل عنصر. من خلال الحصول على المباراة النهائية حيث انضم فقط إلى itemid من peritem المستعار ، ستحصل على ما كان مجموع الأعمدة. ومع ذلك ، نظرًا لعدم الانضمام إلى Rpttotal المستعار ، ستحصل على انضمام ديكارت ... ولكن نظرًا لأن سجله دائمًا ، سيكون لكل صف نفس قيمة عمود "TotalPerall".

آمل أن يعمل هذان الحلول لتلبية احتياجاتك.

نصائح أخرى

أولاً ، لا يدعم VFP حالة عند البناء على مستوى الحقل. بالإضافة إلى ذلك ، فإن الاختيار الفرعي الخاص بك على مستوى الحقل لديه فاصلة بعد الجدول وقبل المكان ، وبعد الشرط ، قبل الترتيب ... مثل

select * from MyTable, where SomeCondition, Order by ...

إذا قمت بعمل تقرير VFP ، فلن تضطر إلى إضافة خطوط إلى مجموعاتك يدويًا في بياناتك الخام ، فيجب أن يتم ذلك في التقرير نفسه عن طريق DataGrouping وإضافة ItemID الخاص بك كأساس للمجموعة. ثم اطلب من نسخة الأعمدة "الملخص" الخاصة بك في نطاق تذييل المجموعة للتقرير لكل عنصر. انقر نقرًا مزدوجًا على الحقل ، وللحساب ، أخبره بـ SUM () ، وإعادة التعيين في نهاية كل مجموعة (أي: itemID). ثم ، قم بتضمين فرقة ملخص التقرير. يطبع هذا مرة واحدة للتقرير بأكمله ... مثل عناصر الملخص على مستوى العنصر ، ونسخ/لصق مرة أخرى ، ولكن وضعت في نطاق ملخص التقرير. انقر نقرًا مزدوجًا على هذه العناصر إلى SUM () وإعادة تعيين في نهاية التقرير.

ومع ذلك ، نظرًا لأنك تعمل في 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...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top