简体   繁体   中英

Filtered DistinctCount Measure and MDX Not Delivering Same Results as SQL

I have the following two queries, one SQL, one MDX:

SQL:

SELECT t.term_report_year, COUNT(*)
FROM(
     SELECT DISTINCT de.term_report_year, fe.student_id
     FROM warehouse.FactEnrolments fe
     INNER JOIN warehouse.DimDate dd
     ON fe.term_record_creation_fk = dd.DateKey
     INNER JOIN warehouse.DimTermEnrolments de
     ON fe.term_enrolments_fk = de.term_enrolments_pk
     WHERE dd.ISOWeekNumberOfYear <= 8 OR dd.ISOYearCode < de.term_report_year
) t
GROUP BY t.term_report_year
ORDER BY term_report_year

MDX:

SELECT 
  NON EMPTY 
    Measures.[Enrolments] ON COLUMNS
 ,NON EMPTY 
      Filter
      (
            [Term Enrolments].[Term Year].Children *
            [Term Record Creation].[ISO Year Code].children *
            [Term Record Creation].[ISO Week Number Of Year].children
       ,
        Cint([Term Record Creation].[ISO Week Number Of Year].CurrentMember.Member_Key) <= 8
        OR
        Cint([Term Record Creation].[ISO Year Code].CurrentMember.Member_key) < Cint([Term Enrolments].[Term Year].CurrentMember.Member_key)
      ) ON ROWS
FROM [Enrolments];

I am trying to express the idea in both, "count the number of students in a year who enrolled for that year before or during the 8th week of that year" where year = term_year .

In my SSAS cube the Enrolments measure is a DistinctCount on student_id . In the SQL query, term_report_year is equivalent to Term Year in the MDX .

Could someone please explain why the two queries are not delivering the same numbers eg the SQL for 2016 gives 2803 and the MDX 2948?

I think it has something to do with the MDX double counting across the weeks, but I can't work out how to fix it.

Try this. I am hopeful it will filter the year total to just weeks <= 8

SELECT 
  NON EMPTY 
    Measures.[Enrolments] ON COLUMNS
 ,NON EMPTY  [Term Enrolments].[Term Year].Children ON ROWS
FROM (
 SELECT
      Filter
      (
            [Term Enrolments].[Term Year].Children *
            [Term Record Creation].[ISO Year Code].children *
            [Term Record Creation].[ISO Week Number Of Year].children
       ,
        Cint([Term Record Creation].[ISO Week Number Of Year].CurrentMember.Member_Key) <= 8
        OR
        Cint([Term Record Creation].[ISO Year Code].CurrentMember.Member_key) < Cint([Term Enrolments].[Term Year].CurrentMember.Member_key)
      ) ON COLUMNS
  FROM [Enrolments]
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM