即使SQL Server 2008还没有结果,如何显示月度数据

时间:2017-01-25 21:29:47

标签: sql sql-server sql-server-2008 tsql

所以我写了一个可以显示每月保费的脚本。假设您想要查看截至11月的总保费,您可以通过SSRS中的参数来选择2016年1月1日至2016年11月30日。这只会显示数据直到11月,不过,我想在12月之前显示它,即使那里没有记录。我如何在SQL中执行此操作?到目前为止,这是我的脚本:

SELECT lc.[Date]
      ,lc.Carrier
      ,lc.[Direct Ceded Written Premium]
      ,cast(cast(year(lc.[date]) as varchar(4)) + '-' + cast(month(lc.[date]) as varchar(2)) + '-01' as date) as [begofmonth]
from
(
SELECT
    CASE
    WHEN pd.TransactionEffDate < pd.TransactionDate THEN cast(pd.TransactionDate as DATE)
    WHEN pd.TransactionEffDate < pd.EffectiveDate THEN cast(pd.EffectiveDate as DATE)
    ELSE cast(pd.TransactionEffDate as date)
    END AS [Date]
    ,CASE WHEN LEFT(PD.POLICYNUM, 3) = 'ORV'
          THEN 'Palomar Value Select OR'
          WHEN LEFT(PD.POLICYNUM, 3) = 'VSE'
          THEN 'Palomar Value Select CA'
          WHEN LEFT(PD.POLICYNUM, 3) = 'WAV'
          THEN 'Palomar Value Select WA'
          ELSE 'Palomar' END AS [Carrier]
    ,ISNULL(SUM(pd.WrittenPremium), 0) AS [Direct Ceded Written Premium]
FROM   premdetail pd 
JOIN transactionpremium tp ON pd.systemid = tp.systemid
AND pd.transactionpremiumid = tp.id
JOIN transactionhistory th ON tp.systemid = th.systemid
AND tp.cmmcontainer = th.cmmcontainer
AND tp.parentid = th.id
JOIN basicpolicy bp ON th.systemid = bp.systemid
AND th.cmmcontainer = bp.cmmcontainer
AND th.parentid = bp.id 
WHERE  
(CASE
    WHEN pd.TransactionEffDate < pd.TransactionDate THEN pd.TransactionDate
    WHEN pd.TransactionEffDate < pd.EffectiveDate THEN pd.EffectiveDate
    ELSE pd.TransactionEffDate
    END) > = CAST(@StartDate AS DATE)
AND (CASE
    WHEN pd.TransactionEffDate < pd.TransactionDate THEN pd.TransactionDate
    WHEN pd.TransactionEffDate < pd.EffectiveDate THEN pd.EffectiveDate
    ELSE pd.TransactionEffDate
  END) < CAST(@EndDate + 1 AS DATE)
AND (bp.carriercd = @ResEQCarrierCd
   OR @ResEQCarrierCd = 'All')  
GROUP  BY
    CASE
    WHEN pd.TransactionEffDate < pd.TransactionDate THEN cast(pd.TransactionDate as DATE)
    WHEN pd.TransactionEffDate < pd.EffectiveDate THEN cast(pd.EffectiveDate as DATE)
    ELSE cast(pd.TransactionEffDate as date)
    END   
    ,CONVERT(VARCHAR, pd.EffectiveDate, 101)
    ,CONVERT(VARCHAR, pd.ExpirationDate, 101)
    ,CASE
        WHEN LEFT(PD.POLICYNUM, 3) = 'ORV'
        THEN 'Palomar Value Select OR'
        WHEN LEFT(PD.POLICYNUM, 3) = 'VSE'
        THEN 'Palomar Value Select CA'
        WHEN LEFT(PD.POLICYNUM, 3) = 'WAV'
        THEN 'Palomar Value Select WA'
        ELSE 'Palomar'
     END
    ,CASE
       WHEN pd.TransactionCode = 'EN' THEN CONVERT(VARCHAR, th.TransactionEffectiveDt, 101)
       ELSE ''
     END
    ,CONVERT(VARCHAR, DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, th.transactiondt) + 1, 0)), 101)
    ,CASE
       WHEN pd.TransactionEffDate < CAST(CONVERT(VARCHAR, pd.TransactionDate, 101) AS SMALLDATETIME) THEN CONVERT(VARCHAR, pd.TransactionDate, 101)
       WHEN pd.TransactionEffDate < pd.EffectiveDate THEN CONVERT(VARCHAR, pd.EffectiveDate, 101)
       ELSE CONVERT(VARCHAR, pd.TransactionEffDate, 101)
     END
) lc
ORDER  BY lc.[Date], lc.[Carrier], lc.[Direct Ceded Written Premium]

使用我拥有的参数,它只会显示到11月。但是,我希望它显示整年,直到12月,在这种情况下,即使没有数据,因为我没有选择enddate变量为12月。我附上了一个示例截图,列出了导出到excel时应该是什么样的。

Excel Sample

1 个答案:

答案 0 :(得分:1)

只是为了给你一个想法:

declare @tbl TABLE(ID INT IDENTITY,SomeValue VARCHAR(100),SomeDate DATE);
INSERT INTO @tbl VALUES('Some date in March',{d'2016-03-05'}),('Some date in June',{d'2016-06-30'});

WITH AllMonths AS
(
              SELECT 1 AS MonthIndex
    UNION ALL SELECT 2
    UNION ALL SELECT 3
    UNION ALL SELECT 4
    UNION ALL SELECT 5
    UNION ALL SELECT 6
    UNION ALL SELECT 7
    UNION ALL SELECT 8
    UNION ALL SELECT 9
    UNION ALL SELECT 10
    UNION ALL SELECT 11
    UNION ALL SELECT 12
)
SELECT MonthIndex
      ,t.*
FROM AllMonths
LEFT JOIN @tbl AS t ON MONTH(t.SomeDate)=MonthIndex 

结果

1   NULL    NULL                NULL
2   NULL    NULL                NULL
3   1       Some date in March  2016-03-05
4   NULL    NULL                NULL
5   NULL    NULL                NULL
6   2       Some date in June   2016-06-30
7   NULL    NULL                NULL
8   NULL    NULL                NULL
9   NULL    NULL                NULL
10  NULL    NULL                NULL
11  NULL    NULL                NULL
12  NULL    NULL                NULL

有很多方法可以创建计数表

  • CTE ROW_NUMBER()
  • 像我的例子中的列表
  • 物理表

维护数字/日期表是个好主意!

previous answer中,我展示了一种创建这样一张桌子的方法。