Tuesday, February 9, 2016

How to list fields from dynamic SQL query in SSRS dataset

Someone over at the MSDN forums suggested I select into a temp table, so I replaced the final exec statement with

 declare @BookStatistic table (BookName varchar(200),
NumberofOrders int,
CollectedOrders int,
CancelledOrders int,
WaitingOrders int,
A1 float,
A2 float,
Efficiency float);
insert @BookStatistic exec(@SQL)

select * from @BookStatistic

--------------------------------------------------------------------------------------------------------------------------------

Full Dynamic Query Sample


/****** Object:  StoredProcedure [dbo].[Rpt_OrderStatistics_Bookwise]    Script Date: 2/10/2016 8:15:50 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Rpt_OrderStatistics_Bookwise]
@FromDate Date,
     @ToDate Date,
@BookName bit = 0,
@TotalOrderAsc bit = 0,
@TotalOrderDesc bit = 0
 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
   Declare @WhereCondition Varchar(max)=''
DEclare @SQL varchar(max)=''

set @SQL=   ' Select  

Book.BookName
,Count(Book.BookName) as ''NumberofOrders''
,SUM(Case WHEN [Order].OrderStatusID =2 THEN 1 ELSE 0 END) as ''CollectedOrders''  
,SUM(Case WHEN [Order].OrderStatusID =3 THEN 1 ELSE 0 END) as ''CancelledOrders''  
,SUM(Case WHEN [Order].OrderStatusID =1 THEN 1 ELSE 0 END) as ''WaitingOrders''  
,Convert(decimal(18,2), (SUM(Case WHEN [Order].OrderStatusID =2 THEN 1 ELSE 0 END))) as ''A1''
,Convert(decimal(18,2), (Count(Book.BookName))) as ''A2''
,Convert(decimal(18,2), 
(
Convert(decimal(18,3), (SUM(Case WHEN [Order].OrderStatusID =2 THEN 1 ELSE 0 END)))  /
Convert(decimal(18,3), (Count(Book.BookName)))
) * 100 )as ''Efficiency''


FROM [Order]
   INNER Join OrderDetail on ([Order].ID = OrderDetail.OrderID)
INNER Join Book on (OrderDetail.BookID = Book.ID)
Where [Order].OrderTypeID = 2
     AND [Order].OrderDate Between '''+CONVERT(VARCHAR(10), @FromDate, 120)+''' and '''+CONVERT(VARCHAR(10), @ToDate, 120)+'''
Group by Book.BookName'


IF @BookName = 1 
BEGIN
 Set @SQL = @SQL + ' Order by Book.BookName '
END

IF @TotalOrderAsc = 1 
BEGIN
 Set @SQL = @SQL + ' Order by Count(Book.BookName) asc '
END

IF @TotalOrderDesc = 1 
BEGIN
 Set @SQL = @SQL + ' Order by Count(Book.BookName) desc '
END


declare @BookStatistic table (BookName varchar(200),
NumberofOrders int,
CollectedOrders int,
CancelledOrders int,
WaitingOrders int,
A1 float,
A2 float,
Efficiency float);
insert @BookStatistic exec(@SQL)
select * from @BookStatistic



END

No comments:

Post a Comment