我需要一个SQL查询来为每个支付会费的公司在2015年和2016年的每个月返回一行。生成的数据集将显示公司没有以零值支付会费的月份。问题是,如果他们没有缴纳会费,他们就不会在数据库中输入一个条目,因此不会出现任何一行而是一个月。这是查询:
SELECT
case when n.co_id <>'' then n.co_id else n.ID end ID
,su.CONTINUOUS_SINCE
,n.COMPANY
,a.EFFECTIVE_DATE
, a.AMOUNT
FROM dbo.Name n
LEFT OUTER JOIN dbo.Activity a ON n.ID = a.ID
inner JOIN dbo.Loc_Info l ON n.ID = l.ID
inner JOIN dbo.Segment_Categories s ON l.CURRENT_SEGMENT = s.CODE
inner JOIN dbo.Subscriptions su on su.id=n.id
WHERE a.PRODUCT_CODE='rental' and n.MEMBER_TYPE in ('rb','rl') and a.EFFECTIVE_DATE Between '2015-07-01' And GetDate() AND a.ACTIVITY_TYPE='dues'
order by case when n.co_id <>'' then n.co_id else n.ID end, EFFECTIVE_DATE asc
如果公司每个月支付一次,那就很好,但关键是要找到那些没有支付的公司,所以假设公司XYZ在2015年每月支付,除了6月我需要在6月份为XYZ公司连续支付有一个NULL值或零或其他指示他们错过了付款。现在,只是省略了行,因为数据不存在,很难找到数千或行中丢失的行。
我意识到这可能是一种不同类型的加入或者其他什么,但我只是没有让它解决。
答案 0 :(得分:1)
您可以为这几个月创建一个虚拟表格,然后将dbo.Activity
加入其中,这样您将获得所有月份,然后将其加入dbo.Name
答案 1 :(得分:0)
1)使用递归cte生成从1到12的所有月份。
2)获取所有月份和公司组合cross join
。
3)left join
在此结果集上显示缺少的月份。
with months as (select 1 mth
union all
select mth+1 from months where mth<12)
,yearmonthscompanies as (select *
from months m
cross join (select 2015 yr union all select 2016 yr) y
cross join (select distinct id,co_id,company from name) c
)
SELECT
case when ymc.co_id <>'' then ymc.co_id else ymc.ID end ID
,su.CONTINUOUS_SINCE
,ymc.COMPANY
,coalesce(a.effective_date,datefromparts(ymc.yr,ymc.mth,1)) as effective_date
,coalesce(a.AMOUNT,0) amount
FROM yearmonthscompanies ymc
LEFT JOIN dbo.Name n ON n.co_id=ymc.co_id and n.id=ymc.id and n.company=ymc.company
LEFT JOIN dbo.Activity a ON n.ID = a.ID and a.PRODUCT_CODE='rental'
and n.MEMBER_TYPE in ('rb','rl') and a.EFFECTIVE_DATE Between '2015-07-01' and GetDate()
and a.ACTIVITY_TYPE='dues'
and year(a.effective_date) = ymc.yr and month(a.effective_date) = ymc.mth
inner JOIN dbo.Loc_Info l ON n.ID = l.ID
inner JOIN dbo.Segment_Categories s ON l.CURRENT_SEGMENT = s.CODE
inner JOIN dbo.Subscriptions su on su.id=n.id
order by case when ymc.co_id <>'' then ymc.co_id else ymc.ID end
,effective_date