Product Transaction Report In MSSQL

#Product Transaction Pivot Report

Create Temporary Tables for (User , Product & Product Transaction)

--# Check if table is available or not --
IF (OBJECT_ID('tempdb..##Tbl_User') IS NOT NULL)
BEGIN
DROP TABLE ##Tbl_User 
END 
-- we have created finalresult table to calculate final result report
IF (OBJECT_ID('tempdb..##Tbl_FinalResult') IS NOT NULL)
BEGIN
DROP TABLE ##Tbl_FinalResult 
END
CREATE TABLE  ##Tbl_User 
(
UID INT PRIMARY KEY NOT NULL IDENTITY(1,1),
UNAME VARCHAR(100)
)
-- Insert Data into user table 
INSERT ##Tbl_User values ('Saee P'),('Swaraj P'),('Sharayu P'),('Atul P'),('Pravin P'),('Ninad P')
--# Check if table is available or not --
IF (OBJECT_ID('tempdb..##Tbl_Product') IS NOT NULL)
BEGIN
DROP TABLE ##Tbl_Product
END
CREATE TABLE ##Tbl_Product
(
PID INT PRIMARY KEY NOT NULL IDENTITY(1,1),
PNAME VARCHAR(100),
PCOST DECIMAL(18,2),
PQUNTITY INT
)
-- Insert Data into Product table 
INSERT ##Tbl_Product values ('Shoes',1200,12),('Laptop',87000,17),('Hard disk',5000,10),('Cricket Bat',2000,14),
('Mobiles',30000,100),('Android TV LG',70000,20),('Solar',34251,20),('MS SQL 2017 Books',7500,100)
--# Product Transaction 
--# Check if table is available or not --
IF (OBJECT_ID('tempdb..##Tbl_ProductTransaction') IS NOT NULL)
BEGIN
DROP TABLE ##Tbl_ProductTransaction
END
CREATE TABLE ##Tbl_ProductTransaction 
(
PTID INT PRIMARY KEY NOT NULL IDENTITY(1,1),
UID INT ,
PID INT
)
-- Insert Data into Product Transaction table 
INSERT ##Tbl_ProductTransaction VALUES
(1,2),(2,2),(1,1),(2,1),(3,1),(3,3),(2,4),(1,2),(2,3),(1,5),(3,5),(2,5),
(1,5),(3,5),(1,6),(2,6),(3,6),(4,6),(1,6),(5,5),(5,5),(5,7),(1,7),(5,7),
(1,7),(5,7),(1,7),(5,7),(1,7),(5,7),(1,7),(1,6),(2,6),(3,6),(4,6),(1,6),(5,5),
(1,2),(2,2),(1,1),(2,1),(3,1),(3,3),(2,4),(1,2),(2,3),(1,5),(3,5),(2,5),
(1,5),(3,5),(1,6),(2,6),(3,6),(4,6),(1,6),(5,5),(5,5),(5,7),(1,7)--,(5,7),
,(1,7),(5,7),(1,7),(5,7),(1,7),(5,7),(1,7),(1,6),(2,6),(3,6),(4,6),(1,6),(5,5),
(4,4),(4,4),(4,2),(4,8)
-- declare variables to calculate sum amount 
-- declare variable for comma separated products
Declare @AllProducts nvarchar(2000)
SET @AllProducts=(
SELECT STRING_AGG(QUOTENAME(PNAME),',') FROM ##Tbl_Product
)
declare @col nvarchar(2000)
SET @col = 
(
     SELECT STRING_AGG(CONCAT('SUM(','ISNULL(',QUOTENAME(PNAME),',0)',')'),'+') FROM ##Tbl_Product
)
--print @col
Declare @AllProductsListFormat nvarchar(2000)
-- Adding INR rupees format for prodcut Cost and runtime amount columns
SET @AllProductsListFormat=(
SELECT STRING_AGG(CONCAT('FORMAT(',QUOTENAME(PNAME),',''C'',''en-IN'')',QUOTENAME(PNAME)),',') FROM ##Tbl_Product
)
Declare @AllProductsListFooterFormat nvarchar(2000)
--SET @AllProductsListFooterFormat= CONCAT('FORMAT(',@col,',''#,0.00'')')
SET @AllProductsListFooterFormat= CONCAT('FORMAT(',@col,',''C'',''en-IN'')')
  --SELECT STRING_AGG(CONCAT('FORMAT(SUM(ISNULL(',QUOTENAME(PNAME),',0))',',''#,0.00'')',QUOTENAME(PNAME)),',') FROM ##Tbl_Product
Declare @AllProductsListFormatTop nvarchar(2000)
SET @AllProductsListFormatTop=(
SELECT STRING_AGG(CONCAT('FORMAT(SUM(ISNULL(',QUOTENAME(PNAME),',0))',',''C'',''en-IN'')',QUOTENAME(PNAME)),',') FROM ##Tbl_Product
)
PRINT @AllProductsListFooterFormat
print @AllProductsListFormatTop
declare @colwithzeroifnull nvarchar(2000)
SET @colwithzeroifnull = 
(
     SELECT STRING_AGG(CONCAT('ISNULL(',QUOTENAME(PNAME),',0)',QUOTENAME(PNAME)),',') FROM ##Tbl_Product
)
print @colwithzeroifnull
declare @SqlAll nvarchar(max)
-- we use dynamic query, if any new product or transaction added then automatically that newly added record also included in Report
SET @SqlAll='
SELECT * INTO ##Tbl_FinalResult FROM (
Select UID,UNAME,'+@colwithzeroifnull+','+@col+' AS ''<<<<=Vertical Total=>>>>'' From (
SELECT  U.UID,U.UNAME,P.PNAME,iSNULL(P.PCOST,0) PCOST FROM ##Tbl_User U LEFT JOIN  ##Tbl_ProductTransaction PT
ON PT.UID=U.UID
LEFT  JOIN ##Tbl_Product P ON P.PID=PT.PID
	 ) 
	 T
	 pivot
	(
	 
	 SUM(T.PCOST)  for T.PName IN
	 (
	 
	'+@AllProducts+'
	 )
	 
	 
	 ) as Pivot_TAble
	  group by UID,UNAME, '+REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@col,'sum(',''),')+',','),')',''),'ISNULL(',''),',0','')+'
	 )q
	 
	 SELECT * FROM
	 (
	 Select UID,UNAME,'+@AllProductsListFormat+','+@AllProductsListFooterFormat+' As ''<<==Vertical Total==>>'' from ##Tbl_FinalResult	
	 group by UID,UNAME, '+REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@col,'sum(',''),')+',','),')',''),'ISNULL(',''),',0','')+'
	 )QX
	 union 
	 Select (IDENT_CURRENT(''##Tbl_User'')+1) UID,
	 ''=>Horizontal Total=>'','+@AllProductsListFormatTop+','+@AllProductsListFooterFormat+'
	FROM ##Tbl_FinalResult
	 '
PRINT @SqlAll

EXEC SP_EXECUTESQL @SqlAll

Final Output