2012-03-29 7 views
1

In einer Excel-Abfrage, brauche ich eine bedingte Anweisung, die ein Feld lesen wird, und basierend auf diesem Wert ein anderes Feld auf ein Minus (oder nicht) festlegen.Case, Wählen Bedingte Requirements

My SQL-Code ist wie folgt:

SELECT "_bvSTTransactionsFull".txdate, 
     SUM("_bvSTTransactionsFull".debit)   AS 'TOTALDebit', 
     SUM("_bvSTTransactionsFull".credit)   AS 'TOTALCredit', 
     SUM("_bvSTTransactionsFull".tax_amount)  AS 'TOTALTax_Amount', 
     SUM("_bvSTTransactionsFull".VALUE)   AS 'TOTALValue', 
     SUM("_bvSTTransactionsFull".actualvalue)  AS 'TOTALActualValue', 
     SUM("_bvSTTransactionsFull".actualsalesvalue) AS 'TOTALActualSalesValue', 
     SUM("_bvSTTransactionsFull".profit)   AS 'TOTALProfit' 
FROM sqlschema.dbo."_bvSTTransactionsFull" "_bvSTTransactionsFull" 
WHERE ("_bvSTTransactionsFull".txdate >=? 
     AND "_bvSTTransactionsFull".txdate <=?) 
GROUP BY "_bvSTTransactionsFull".txdate, 
      "_bvSTTransactionsFull".description 
HAVING ("_bvSTTransactionsFull".description LIKE 'POS Sale') 
     OR ("_bvSTTransactionsFull".description LIKE 'POS Return') 
ORDER BY "_bvSTTransactionsFull".txdate 

ich die Auswahlabfrage muß auf einem Feld suchen namens "ActualQuantity" (in der Tabelle "_bvSTTransactionsFull"), und wenn dieses Feld < 0, dann Tax_Amount = -(Tax_Amount) oder if ActualQuantity >=0, then Tax_Amount = Tax_Amount.

Bitte beachten Sie, dass die Abfrage "summiert" ist, also nehme ich an, dass dieser bedingte Aspekt behandelt werden muss, bevor die Summierung stattfindet. Die Abfrage summiert ungefähr 100 000 Datensätze zu täglichen Summen.

Antwort

0
SELECT "_bvSTTransactionsFull".txdate, 
     SUM("_bvSTTransactionsFull".debit)   AS 'TOTALDebit', 
     SUM("_bvSTTransactionsFull".credit)   AS 'TOTALCredit', 
     SUM(case when "_bvSTTransactionsFull".ActualQuantity >= 0 
      then "_bvSTTransactionsFull".tax_amount 
      else - "_bvSTTransactionsFull".tax_amount 
      end)          AS 'TOTALTax_Amount', 
     SUM("_bvSTTransactionsFull".VALUE)   AS 'TOTALValue', 
     SUM("_bvSTTransactionsFull".actualvalue)  AS 'TOTALActualValue', 
     SUM("_bvSTTransactionsFull".actualsalesvalue) AS 'TOTALActualSalesValue', 
     SUM("_bvSTTransactionsFull".profit)   AS 'TOTALProfit' 
FROM sqlschema.dbo."_bvSTTransactionsFull" "_bvSTTransactionsFull" 
WHERE ("_bvSTTransactionsFull".txdate >=? 
     AND "_bvSTTransactionsFull".txdate <=?) 
GROUP BY "_bvSTTransactionsFull".txdate, 
      "_bvSTTransactionsFull".description 
HAVING ("_bvSTTransactionsFull".description LIKE 'POS Sale') 
     OR ("_bvSTTransactionsFull".description LIKE 'POS Return') 
ORDER BY "_bvSTTransactionsFull".txdate 

Wenn ActualQuantity könnte Null sein, aber taxAmount in der gleichen Zeile Null auch Sie sign function Zeichen von TAX_AMOUNT ändern können:

sign(ActualQuantity) * tax_amount 

UPDATE:

So entnehme ich, dass MS Query hat Probleme bei der Verwendung von Parametern in einer Abfrage, die nicht grafisch angezeigt werden können. Problemumgehung besteht darin, Parameter durch einige Konstanten zu ersetzen, Arbeitsmappen als XML zu speichern und Konstanten in "?" Zu ändern. There is a link showing VBA code which does replacement on-site, aber Sie müssen herausfinden, wie es funktioniert, da ich VBA nicht so viel weiß.

UPDATE 2:

Auf der anderen Seite ist der einfachste Weg aus Sicht in der Datenbank zu erstellen.

+0

Danke Nikola, aber nicht in Excel 2007 Abfrage arbeiten. Standardfehler –

+0

Ich habe case ... end-Anweisung in MS Query versucht. Es klappt. Wie führst du diese Abfrage aus? Und was ist der Fehler? –

+0

Nikola, ich öffne den SQL-Dialog in der MS-Abfrage und ersetze die Sum-Anweisung für den TAX_Amount wie folgt: Summe ("_ bvSTTransactionsFull" .Credit) AS 'TOTALCredit', Sum (Fall wenn "_bvSTTransactionsFull" .ActualQuantity> = 0 dann „_bvSTTransactionsFull“ .tax_amount andere - „_ bvSTTransactionsFull“ .tax_amount Ende) AS TOTALTax_Amount‘, Der Fehler ist ‚Parameter werden in Abfragen nicht erlaubt, die nicht grafisch dargestellt werden kann‘ –