2013-03-20 16 views
6

Korzystanie z SQL Server 2008, Próbuję uzyskać zwrot niektórych z tych kolumn, by powrócić jako $ xxx, xxx.xxTSQL Obsada jako sumę pieniędzy

To jest zapytanie, które używam (w tym kwerendy następnie niektóre aktualizacje tylko do obliczania numerów i wybierz ##tempshow na końcu)

SELECT 
    CASE GROUPING(s.StoreID) WHEN 1 THEN '' ELSE s.StoreID END [StoreID], 
    CASE GROUPING(p.VendorID) WHEN 1 THEN '' ELSE p.VendorID END [VendorID], 
    SUM(d.Quantity) AS [UnitSold], 
    CAST(SUM(d.amount * d.quantity) AS DECIMAL(18,2)) AS Amount, 
    CAST(SUM(d.Discount) AS DECIMAL(18,2)) AS Discount, 
    CAST(SUM((d.Amount * d.Quantity - d.Discount)) AS DECIMAL(18,2)) AS ExtSold, 
    CAST(SUM(d.Cost * d.Quantity) AS DECIMAL(18,2)) AS Cost, 
    CAST(0 AS DECIMAL(18,2)) AS Profit, 
    CAST(0 AS DECIMAL(18,2)) AS OnHand, 
    CAST(0 AS DECIMAL(18,2)) AS OnHandRetail, 
    CAST(0 AS DECIMAL(18,2)) AS OnHandCost, 
    CAST(0 AS DECIMAL(18,2)) AS ReceivedCost, 
    CAST(0 AS DECIMAL(18,2)) AS ReceivedRetail, 
    CAST(0 AS DECIMAL(18,2)) AS ReceivedQty, 
    CAST(0 AS DECIMAL(18,2)) AS Margin, 
    CAST(0 AS DECIMAL(12,2)) AS TurnOver, 
    CAST(0 AS INTEGER) AS OnOrder 
INTO 
    ##tempshow 
FROM 
    RPTrs s, 
    RPTrsd d, 
    RPIv i, 
    RPProducts p 
WHERE 
    s.ReceiptNO = d.ReceiptNO and 
    s.StoreID = d.StoreID and 
    i.UPC = d.UPC and 
    i.StoreID = d.StoreID and 
    p.ProductID = i.IVProduct and 
    s.StoreID = '01' and 
    s.TRSDate > GETDATE()-20 and 
    p.Service = 0 
GROUP BY 
    GROUPING SETS((s.StoreID,p.VendorID),()) 

które zwraca: enter image description here

próbowałem

CAST(SUM(d.amount * d.quantity) AS MONEY) AS Amount,

i

SUM(CAST((d.amount * d.quantity) AS MONEY)) AS Amount,

oczekiwany wynik (plus pozostałe kolumny są takie same jak tej kolumnie Amount):

|StoreID | VendorID | UnitSold | Amount 
--------------------------------------------- 
1 | 01  | 0000  | 0  | $0.00 
2 | 01  | am  | 62  | $6,275.00 
3 | 01  | AO  | 58  | $18,964.00 
4 | 01  | payless | 6  | $1,383.36 
5 |  |   | 126  | $26,622.36 

muszę Amount, Discount, ExtSold, Cost, Profit, OnHandRetail, OnHandCost, ReceivedCost, ReceivedRetail być w formacie pieniędzy

+2

Być może są mylące type_ _data i _format_. Formatowanie, np. dodanie symbolu waluty, separatora tysięcy i punktu odniesienia, lepiej zostawić w aplikacji. – HABO

+0

Niestety nie mogę tego zrobić, ponieważ jest to po prostu prosta funkcja raportowania w oprogramowaniu i po prostu bierze zapytanie i wyniki, co jest w zapytaniu – JohnZ

+0

@JohnZ: Czy można tę funkcję zastąpić nieco bardziej złożoną? Naprawdę, nawet jeśli w T-SQL można osiągnąć to, czego oczekujesz, poziom prezentacji powinien zadbać o formatowanie. Baza danych powinna tylko dbać o dostarczanie danych w tym przypadku. –

Odpowiedz

16

To jest coś, co powinno być wykonane na warstwie prezentacji, ale jeśli trzeba to zrobić w SQL można użyć:

'$'+convert(varchar(50), CAST(amount as money), -1) amount 

Oto przykład:

;with cte (amount) 
as 
(
    select 123254578.00 union all 
    select 99966.00 union all 
    select 0.00 union all 
    select 6275.00 union all 
    select 18964.00 union all 
    select 1383.36 union all 
    select 26622.36 
) 
select '$'+convert(varchar(50), CAST(amount as money), -1) amount 
from cte 

Zobacz SQL Fiddle with Demo. Ten wraca:

|   AMOUNT | 
------------------- 
| $123,254,578.00 | 
|  $99,966.00 | 
|   $0.00 | 
|  $6,275.00 | 
|  $18,964.00 | 
|  $1,383.36 | 
|  $26,622.36 | 

Uwaga: To będzie o wiele łatwiejsze w SQL Server 2012, ponieważ można używać FORMAT()

;with cte (amount) 
as 
(
    select 123254578.00 union all 
    select 99966.00 union all 
    select 0.00 union all 
    select 6275.00 union all 
    select 18964.00 union all 
    select 1383.36 union all 
    select 26622.36 
) 
select '$'+FORMAT(amount,'#,0.0000') amount 
from cte 

Zobacz SQL Fiddle with Demo

+0

jeszcze raz pomknij na ratunek.Dziękuję bardzo, twoje '' $ '+ konwertuj (varchar (50), CAST (kwota jako pieniądze), -1) kwota 'działało jak czar – JohnZ

+0

Co robi -1? – bonh

+0

@bonh Dodaje przecinki do wartości numerycznej. – Taryn

3

Dodawanie do odpowiedzi bluefeet, w funkcji formatowania dostępnej w SQL 2012 można zrobić tak:

SELECT FORMAT(12345.6789, 'C', 'en-us') 

Th e C oznacza walutę, a ostatnim argumentem jest kultura. Kultura jest ważna, jeśli chcesz, aby aplikacja była wielojęzyczna, ponieważ zajmuje się znakami dolara (lub euro) i separatorem tysięcy. Na przykład:

SELECT 
FORMAT(12345.6789, 'C', 'en-us') as "USA", 
FORMAT(12345.6789, 'C', 'fr-ca') as "French Canada", 
FORMAT(12345.6789, 'C', 'fr-fr') as "French France", 
FORMAT(12345.6789, 'C', 'hi-in') as "Hindi India" 

dadzą ten wynik:

USA   French Canada  French France  Hindi India 
----------- -------------  -------------- -------------- 
$12,345.68  12 345,68 $   12 345,68 €  ₹ 12,345.68