2010-05-14 4 views
1

В Visual Foxpro 9 Я пытаюсь написать sql с столбцом «subtotal» продукта и столбцом «total».
Код 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') ; 
+0

Привет, Tass-man, если вы работаете в VFP и хотите, чтобы вы прокомментировали дополнительную дополнительную помощь по ложке, сообщите мне прямо ... [email protected] – DRapp

ответ

1

Кроме того, если вы просто хотите итоговые столбцы в таблице, вы могли бы сделать что-то вроде

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, как ваши последние 2 таблицы (одна группировки по Itemid) создаст общее количество элементов. Имея финал, в котором присоединяется только к ItemID псевдонима PerItem, вы получите то, что было в этом столбце. Однако, поскольку NO присоединяется к псевдониму RptTotal, вы получите Cartesian join ... но так как его всегда 1 запись, каждая строка будет иметь такое же значение, как и столбец «TotalPerAll».

Я надеюсь, что эти два решения будут работать для ваших нужд.

1

Во-первых, VFP не поддерживает случай - при построении на уровне поля. Кроме того, ваш суб-выбор на уровне поля имеет запятую после из таблицы и до где, и после пункта, где до порядка ... такие как

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

Если делать отчет VFP, вы не не нужно вручную добавлять строки в свои группы в свои необработанные данные, что должно быть сделано в самом отчете с помощью datagrouping и добавить ваш ItemID в качестве основы для группы. Затем ваши «суммируемые» столбцы копируются/вставляются в группу нижнего колонтитула группы для каждого элемента. Дважды щелкните по полю и для расчета скажите ему sum() и сбросьте в конце каждой группы (то есть: ItemID). Затем включите отчетную группу отчетов. Это печатает один раз для всего отчета ... Как и итоговые элементы на уровне элемента, скопируйте/вставьте снова, но введите в сводку отчета отчет. Дважды щелкните эти элементы, чтобы суммировать() и сбрасывать в КОНЕЦ ДОКЛАДА.

Однако, поскольку вы работаете в VFP9, и вам может потребоваться выполнить DUMP-вывод с линиями, уже включенными в их соответствующие позиции, я бы разбился на отдельные запросы и объединил результаты вместе, как я пробовал ниже. Предварительно извлеките то, что было бы поддержкой позиций для данных отчета без каких-либо необходимых агрегатов.

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... 
+0

Drapp, Большое спасибо за помощь SQL. У меня не было места. Tass-man –

+0

Да, но кто-то из них работал на вас ... Для вашей репутации репутации хорошо выбрать «галочку» рядом с решениями для признания приема. С низкой репутацией другие могут не предлагать помощь. Просто FYI на форуме ... – DRapp

+0

Извините, DRApp, я очень к этому знаком и все еще привязываюсь, чтобы понять, как поместить его в свой sql, поэтому на этом этапе не знаю, что будет работать. Думаю, мне, наверное, нужно кормить ложкой. –

Смежные вопросы