-
26-09-2019 - |
質問
Visual FoxPro 9で、私は、製品の「小計」欄及び報告書「合計」欄で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') ;
解決
また、あなたがテーブルの列と合計をしたいだけならば、あなたのような何かを行うことができます。
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
あなたの最後の2つのテーブル(ITEMIDによってグループ分け1)として、SQL-選択を行うことで項目ごとの合計を作成します。唯一のエイリアスPerItemのアイテムIDに参加ところ、最終的に持つことにより、あなたはその列の合計が何であっても得られます。デカルトが参加NOがエイリアスRptTotalに参加するので、あなたが得るでしょう...しかし、その常に1記録するので、各行は、その「TotalPerAll」の列と同じ値を持つことになります。
私は、これら2つのソリューションは、ニーズのために働く願っています。
他のヒント
まず、VFPは、フィールドレベルでのケース-とき構文をサポートしていません。また、あなたのフィールドレベルでのサブ選択テーブルから、どこの前に、注文前にwhere句、...など。
などの後の後にカンマを持っていますselect * from MyTable, where SomeCondition, Order by ...
VFPのレポートを行う場合は、手動でdatagroupingとグループの基礎として、あなたのアイテムIDを追加することにより、レポート自体で行う必要があり、あなたの生データ、にあなたのグループに行を追加する必要はありません。次に、あなたの「summable」の列は項目ごとにレポートのグループフッターバンドに貼り付け/コピーしています。フィールドをダブルクリックして、計算のために、それは)(合計する伝える、および各グループの終了時にリセットする(すなわち:アイテムID)。次に、レポートのサマリー区域が含まれます。レポート全体のかつてこのプリントは...アイテムレベルでのサマリー項目と同様に、コピー/貼り再びが、レポートのサマリー区域に入れます。ダブル(合計にそれらの要素をクリックする)と、レポートの最後にリセットされます。
しかし、あなたは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...