Prashant16
Prashant16

Reputation: 1526

Multiple Query to Single Query

I am working with SQL Server 2008.

I created a stored procedure like this:

SELECT  SUM(m.BookingAmt) + SUM(m.FormFee) AS 'SIP'
FROM    dbo.Member AS m
    INNER JOIN dbo.PlanMaster AS pm ON m.PlanId = pm.PlanId
    INNER JOIN dbo.PlanTypeMaster AS ptm ON pm.PlanTypeId = ptm.PlanTypeId
WHERE   ptm.IsSingleInstallment = 'true'
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND m.CommencementDate = @Date

SELECT  SUM(i.PaymentAmt) + SUM(m.FormFee) AS 'Fresh'
FROM    dbo.Installment AS i
    INNER JOIN dbo.Member AS m ON i.MemberId = m.MemberId
    INNER JOIN dbo.PlanMaster AS pm ON i.PlanId = pm.PlanId
    INNER JOIN dbo.PlanTypeMaster AS ptm ON pm.PlanTypeId = ptm.PlanTypeId
WHERE   i.InstallmentNo = 1
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date
    AND ptm.IsSingleInstallment = 'false'

SELECT  SUM(i.PaymentAmt) AS '1stYear'
FROM    dbo.Installment AS i
    INNER JOIN dbo.Member AS m ON i.MemberId = m.MemberId
WHERE   i.InstallmentNo > 1
    AND i.InstallmentNo < 13
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date


SELECT  SUM(i.PaymentAmt) AS '2ndYear'
FROM    dbo.Installment AS i
    INNER JOIN dbo.Member AS m ON i.MemberId = m.MemberId
WHERE   i.InstallmentNo > 12
    AND i.InstallmentNo < 25
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date

SELECT  SUM(i.PaymentAmt) AS '3rdYear'
FROM    dbo.Installment AS i
    INNER JOIN dbo.Member AS m ON i.MemberId = m.MemberId
WHERE   i.InstallmentNo > 24
    AND i.InstallmentNo < 37
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date

SELECT  SUM(i.PaymentAmt) AS '4thYear'
FROM    dbo.Installment AS i
    INNER JOIN dbo.Member AS m ON i.MemberId = m.MemberId
WHERE   i.InstallmentNo > 36
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date

but I want to get result like this...

---------------------------------------------------------------------
  Date       | SIP  |  Fresh  | 1stYear | 2ndYear | 3rdYear | 4thYear |
---------------------------------------------------------------------
  01/02/2013 | 2000 |  2500   |  5000   |  3500   |  4500   |  6500   |
 ------------------------------------------------------- --------------
  02/02/2013 | 6500 |  5000   |  1500   |  4500   |   3520  |  1852   |
  --------------------------------------------------------------------
  03/02/2013 | 2560 |  2500   |  3500   |  4500   |  2000   |   2000  |

How can I get above result using one query? Please help me. Thanks

Upvotes: 1

Views: 87

Answers (1)

Taryn
Taryn

Reputation: 247860

You can consolidate the queries that generate the 1stYear, 2ndYear, etc by using an aggregate function with a CASE expression to create columns instead of rows.

Then you can create subqueries for the other two, finally joining them all together on the date. So your final query could be:

SELECT coalesce(q1.CommencementDate, q2.PaymentDate, q3.PaymentDate) date,
  q1.SIP,
  q2.Fresh,
  q3.[1stYear],
  q3.[2ndYear],
  q3.[3rdYear],
  q3.[4thYear]
FROM
(
  SELECT m.CommencementDate,
    SUM(m.BookingAmt) + SUM(m.FormFee) AS 'SIP'
  FROM dbo.Member AS m
  INNER JOIN dbo.PlanMaster AS pm 
    ON m.PlanId = pm.PlanId
  INNER JOIN dbo.PlanTypeMaster AS ptm 
    ON pm.PlanTypeId = ptm.PlanTypeId
  WHERE ptm.IsSingleInstallment = 'true'
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND m.CommencementDate = @Date
) q1
FULL OUTER JOIN
(
  SELECT i.PaymentDate,
    SUM(i.PaymentAmt) + SUM(m.FormFee) AS 'Fresh'
  FROM dbo.Installment AS i
  INNER JOIN dbo.Member AS m 
    ON i.MemberId = m.MemberId
  INNER JOIN dbo.PlanMaster AS pm 
    ON i.PlanId = pm.PlanId
  INNER JOIN dbo.PlanTypeMaster AS ptm 
    ON pm.PlanTypeId = ptm.PlanTypeId
  WHERE i.InstallmentNo = 1
    AND m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date
    AND ptm.IsSingleInstallment = 'false'
) q2
  ON q1.CommencementDate = q2.PaymentDate
FULL OUTER JOIN
(
  SELECT i.PaymentDate,
    sum(case 
          when i.InstallmentNo > 1 AND i.InstallmentNo < 13
          then i.PaymentAmt else 0 end) AS [1stYear],
    sum(case 
          when i.InstallmentNo > 12 AND i.InstallmentNo < 25
          then i.PaymentAmt else 0 end) AS [2ndYear],
    sum(case 
          when i.InstallmentNo > 24 AND i.InstallmentNo < 37
          then i.PaymentAmt else 0 end) AS [3rdYear],
    sum(case 
          when i.InstallmentNo > 36
          then i.PaymentAmt else 0 end) AS [4thYear]
  SUM(i.PaymentAmt) AS '1stYear'
  FROM dbo.Installment AS i
  INNER JOIN dbo.Member AS m 
    ON i.MemberId = m.MemberId
  WHERE m.CompanyId = @CompanyId
    AND m.CscId = @CscId
    AND i.PaymentDate = @Date
  GROUP BY i.PaymentDate
) q3
  ON q1.CommencementDate = q3.PaymentDate;

Upvotes: 2

Related Questions