3
votes

Somme d'espèces et chèque d'une table

Je dois obtenir la somme en espèces et le montant du chèque à partir d'un tableau en 2 colonnes trié par vendeur.

Ma table est comme ceci:

Salesman       Cash      Cheque
Salesman A     21151     13944
Salesman B     34510     87368
Salesman C     21252     20182
Salesman D     13356     23862


1 commentaires

Quelle est la sortie actuelle du SQL?


4 Réponses :


5
votes

Vous pouvez essayer ce qui suit.

name        Cash    cheque
--------------------------
Salesman A  21151   13944
Salesman B  34510   87368
Salesman C  21252   20182
Salesman D  13356   23862

Le résultat est comme indiqué ci-dessous

create table #Temp (name varchar(50), collectionType varchar(10), amount int)
insert into #Temp values
('Salesman A', 'Cash', 21151),
('Salesman B', 'Cash', 34510),
('Salesman C', 'Cash', 21252),
('Salesman D', 'Cash', 13356),
('Salesman A', 'Cheque', 13944),
('Salesman B', 'Cheque', 87368),
('Salesman C', 'Cheque', 20182),
('Salesman D', 'Cheque', 23862)

SELECT name, Cash, cheque 
FROM  
(SELECT collectionType, name , amount 
    FROM #Temp) AS SourceTable  
PIVOT  
(  
SUM(amount)  
FOR collectionType IN ( Cash ,  Cheque)  
) AS PivotTable;

Vous pouvez trouver la démo en direct Ici .


0 commentaires

3
votes

Les suggestions de pivotement sont une sur-complication VAST pour cela. Ignore les. Utilisez simplement la sommation conditionnelle. Un exemple simplifié:

select Salesman, sum(case Paymode when 'Cash' then Collection else 0 end) as Cash, ...
from Prospect_Detail 
where Purpose = 'Collections'
group by Salesman 
order by Salesman;


2 commentaires

Je ne vois pas que PIVOT soit plus ou moins compliqué que cela. Balançoires et ronds-points pour moi vraiment


@MartinSmith Vous ne pouvez pas, mais OP pose une question assez basique pour toute personne ayant une expérience significative. Par conséquent, pivot (qui est une commande que l'on maîtrise généralement plus tard) est beaucoup trop compliqué pour l'OMI pour OP . Vous devez marcher avant de pouvoir courir.



2
votes

Il est possible d'utiliser l'opérateur PIVOT pour obtenir le résultat souhaité:

SalesMan    Cash    Cheque
Salesman A  21151   13944
Salesman B  34510   87368
Salesman C  21252   20182
Salesman D  13356   23862

Ouptut:

DECLARE @tbl TABLE
(
   SalesMan varchar(50),
   PayType VARCHAR(10),
   Amount INT
)

INSERT INTO @tbl
(
    SalesMan,
    PayType,
    Amount
)
VALUES
  ('Salesman A', 'Cash',  21151)
, ('Salesman B', 'Cash',    34510)
, ('Salesman C', 'Cash',    21252)
, ('Salesman D', 'Cash',    13356)
, ('Salesman A', 'Cheque',  13944)
, ('Salesman B', 'Cheque',  87368)
, ('Salesman C', 'Cheque',  20182)
, ('Salesman D', 'Cheque',  23862)

SELECT * 
FROM 
(
    SELECT * FROM @tbl
)AS FooData
PIVOT(
    AVG(FooData.Amount)
    FOR PayType IN ([Cash], [Cheque])
) AS FooPivot

p>


0 commentaires

2
votes

Vous pouvez faire pivoter votre tableau de la manière suivante

With c as(
SELECT Salesman
     , Paymode
     , Sum(Collection) AS Cheque
FROM 
    Prospect_Detail
GROUP BY 
      Salesman
    , Paymode
)
Select Salesman
      ,[Cash]
      ,[Cheque] 
From C
Pivot(
    Sum(Cheque)
    For Paymode in ([Cash],[Cheque]) 
) as pvt;

J'espère que cela fonctionne pour vous.


0 commentaires