需要SQL逻辑帮助

时间:2017-05-17 17:42:12

标签: sql sql-server reporting-services ssrs-2012

我正在使用Reporting Services在SQL Server 2012中构建一个查询,该查询为我提供了一个成员列表,该成员在第一个时期使用了其帐户中的服务但在第二个时期没有在其帐户中使用服务。< / p>

我正在使用的表格是:

  • 会员(会员名单)
  • SS(会员帐户上的服务列表)
  • SSUSED:记录所使用的服务(某些服务可以是1个中的1个,3个中的3个或6个中的6个)
  • 产品 - 产品清单
  • PRODUCTCATS - 产品类别

我已经构建了以下查询,该查询为我提供了在特定时间段内使用其帐户中的产品的成员列表,但我在过滤掉在第二期使用产品的人时遇到了问题。

成员表给了我memid的唯一成员标识符,SS给我一个memid链接的成员帐户服务表,SSUSED保存所用服务的历史记录,产品给我SS表上的产品和PRODUCTCATS是一个列出PRODUCTS表的产品类别的表。产品链接到带有产品的PRODUCTCATS,成员链接到带有memid的SS,SS链接到带有ssid的SSUSED。

SELECT     
    MEMBERS.memid
FROM            
    SS 
INNER JOIN
    SSUSED ON SS.ssid = SSUSED.ssid 
INNER JOIN
    MEMBERS ON SS.memid = MEMBERS.memid 
INNER JOIN
    PRODUCTS ON SS.productid = PRODUCTS.productid 
INNER JOIN
    PRODUCTCATS ON PRODUCTS.productcatid = PRODUCTCATS.productcatid
WHERE        
    (SSUSED.usedate BETWEEN @rvStartWeek1 AND @rvEndWeek1) 
    AND (PRODUCTS.productcatid IN (27, 28, 29, 58, 77, 75, 30, 61, 31, 32, 47, 68))
    AND (MEMBERS.siteid = @rvSite)

3 个答案:

答案 0 :(得分:1)

使用以下内容:

y <- c(1, 2, NA, NA, 5)
z <- c(NA, NA, 3, 4, 5)
coalesce(y, z)

[1] 1 2 3 4 5

答案 1 :(得分:0)

您可以为成员记录在period1和period2中出现的次数添加一个计数,然后检查。

data = {'a': [10,6,-3,-2,4,12,3,3], 'b': [6,-3,12,12,8,11,-5,-5], 'id': [1,1,1,1,2,2,2,2]}
df = pandas.DataFrame.from_dict(data)
grouper = df[df.b > 10].groupby(df.id)
filtered = list()
for group, group_data in grouper:
    filtered.append(group_data.apply(min))
df_filtered = pandas.DataFrame.from_records(filtered)

# output
    a   b  id
0  -3  12   1
1  12  11   2

答案 2 :(得分:0)

所以成员(MEMBERS)和使用的服务(SSUSED)是n:m相关的,你有一个桥表SS。您可以通过此表加入成员和服务,并按成员汇总。计算两个时期的条目:

select m.memid
from members m
join ss on ss.memid = m.memid
join ssused s on s.ssid = ss.ssid
where m.siteid = @rvSite
and ss.productid in
(
  select pc.productid
  from productcats pc
  where pc.productcatid in (27, 28, 29, 58, 77, 75, 30, 61, 31, 32, 47, 68)
)
group by m.memid
having count(case when s.usedate between @rvStartWeek1 and @rvEndWeek1 then 1 end) > 1
   and count(case when s.usedate between @rvStartWeek2 and @rvEndWeek2 then 1 end) = 0;