web-dev-qa-db-fra.com

TSQL Cast the sum as Money

À l'aide de SQL Server 2008, j'essaie d'obtenir le retour de certaines de ces colonnes pour revenir en tant que $ xxx, xxx.xx

C'est la requête que j'utilise (cette requête puis quelques mises à jour juste pour calculer les nombres et sélectionner ##tempshow À la fin)

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),())

Qui retourne: enter image description here

J'ai essayé

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

et

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

Sortie attendue (plus les autres colonnes identiques à cette colonne 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

J'ai besoin que le Amount, Discount, ExtSold, Cost, Profit, OnHandRetail, OnHandCost, ReceivedCost, ReceivedRetail Soit au format monétaire

12
JohnZ

C'est quelque chose qui devrait être fait sur la couche de présentation, mais si vous devez le faire en sql, vous pouvez utiliser:

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

Voici un exemple:

;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

Voir SQL Fiddle with Demo . Cela renvoie:

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

Remarque: Cela sera beaucoup plus facile dans SQL Server 2012 car vous pouvez utiliser 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

Voir SQL Fiddle with Demo

21
Taryn

Ajoutant à la réponse de Bluefeet, la fonction FORMAT disponible dans SQL 2012 pourrait se faire comme ceci:

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

Le C signifie monnaie, et le dernier argument est la culture. La culture est importante si vous voulez que votre application soit multilingue, car elle s'occupe de choses comme les signes dollar (ou euro) et le séparateur de milliers. Par exemple:

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"

Donnera ce résultat:

USA            French Canada        French France     Hindi India
-----------    -------------        --------------    --------------
$12,345.68     12 345,68 $          12 345,68 €       ₹ 12,345.68
6
Jamie Le Tual