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
4 Réponses :
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 .
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;
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.
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>
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.
Quelle est la sortie actuelle du SQL?