加入计数并对结果进行排序tql

时间:2014-03-27 18:13:54

标签: sql-server tsql

这是我的Count_query:

Declare @yes_count decimal;
Declare @no_count decimal;

set @yes_count=(Select count(*) from Master_Data where Received_Data='Yes');
set @no_count=(Select count(*) from Master_Data where Received_Data='No');
select @yes_count As Yes_Count,@no_count as No_Count,(@yes_count/(@yes_count+@no_count)) As Submission_Count

我无法在这两个查询上加入

这是查询的其余部分:

Select Distinct D.Member_Id,d.Name,d.Region_Name, D.Domain,e.Goal_Abbreviation, 
 e.Received_Data, case when Received_Data = 'Service Not Provided'  then null 
 when Received_Data = 'No' then null   else e.Improvement end  as 
  Percent_Improvement , case when Received_Data = 'Service Not Provided'  then null 
  when Received_Data = 'No' then null else e.Met_40_20 end as Met_40_20 
   FROM (
select  distinct member_Domains.*,
        (case when NoData.Member_Id is null then 'Participating' else ' ' end) as Participating
        from
        (
        select distinct members.Member_Id, members.Name, Members.Region_Name, 
        case when Domains.Goal_Abbreviation = 'EED Reduction' then 'EED' 
        When Domains.Goal_Abbreviation = 'Pressure Ulcers' then 'PRU' 
          when Domains.Goal_Abbreviation = 'Readmissions' then 'READ' else Domains.Goal_Abbreviation end as Domain from 
        (select g.* from    Program_Structure as ps inner join Goal as g on ps.Goal_Id = g.Goal_Id 
        and ps.Parent_Goal_ID = 0) as Domains
        cross join
        (select distinct hc.Member_ID, hc.Name,hc.Region_Name from zsheet as z 
        inner join Hospital_Customers$ as hc on z.CCN = hc.Mcare_Id) as Members
        ) as member_Domains
        left outer join Z_Values_Hospitals as NoData on member_Domains.member_ID = NoData.Member_Id 
        and Member_Domains.Domain = noData.ReportName) D

Left Outer JOIN

(SELECT B.Member_ID, B.Goal_Abbreviation, B.minRate, C.maxRate, B.BLine, C.Curr_Quarter, B.S_Domain,
(CASE WHEN B.Member_ID IN
                      (SELECT member_id
                       FROM      Null_Report
                       WHERE   ReportName = B.S_Domain) THEN 'Service Not Provided' WHEN Curr_Quarter = 240 THEN 'Yes' ELSE 'No' END) AS Received_Data, 

                       ROUND((CASE WHEN minRate = 0 AND maxRate = 0 THEN 0 WHEN minRate = 0 AND maxRate > 0 THEN 1 ELSE (((maxRate - minRate) / minRate) * 100) END), .2) AS Improvement, 
                  (CASE WHEN ((CASE WHEN minRate = 0 AND maxRate = 0 THEN 0 WHEN minRate = 0 AND maxRate > 0 THEN 1 ELSE (maxRate - minRate) / minRate END)) <= - 0.4 OR
                  maxRate = 0 THEN 'Yes' WHEN ((CASE WHEN minRate = 0 AND maxRate = 0 THEN 0 WHEN minRate = 0 AND maxRate > 0 THEN 1 ELSE (maxRate - minRate) / minRate END)) 
                  <= - 0.2 OR maxRate = 0 THEN 'Yes' ELSE 'No' END) AS Met_40_20
FROM     (SELECT tab.Member_ID, tab.Measure_Value AS minRate, tab.Goal_Abbreviation, A.BLine, tab.S_Domain 
                  FROM      Measure_Table_Description AS tab INNER JOIN
                                        (SELECT DISTINCT 
                                                           Member_ID AS new_memid, Goal_Abbreviation AS new_measure, MIN(Reporting_Period_ID) AS BLine, MAX(Reporting_Period_ID) 
                                                           AS Curr_Quarter
                                         FROM      Measure_Table_Description
                                         WHERE   (Member_ID > 1) AND (Measure_Value IS NOT NULL) AND (Measure_ID LIKE '%O%')
                                         GROUP BY Goal_Abbreviation, Member_ID) AS A ON tab.Member_ID = A.new_memid AND tab.Reporting_Period_ID = A.BLine AND 
                                    tab.Goal_Abbreviation = A.new_measure) AS B FULL OUTER JOIN
                      (SELECT tab.Member_ID, tab.Measure_Value AS maxRate, tab.Goal_Abbreviation, A_1.Curr_Quarter
                       FROM      Measure_Table_Description AS tab INNER JOIN
                                             (SELECT DISTINCT 
                                                                Member_ID AS new_memid, Goal_Abbreviation AS new_measure,
                                                                 MIN(Reporting_Period_ID) AS BLine, MAX(Reporting_Period_ID) 
                                                                AS Curr_Quarter
                                              FROM      Measure_Table_Description AS Measure_Table_Description_1
                                              WHERE   (Member_ID >1) AND (Measure_Value IS NOT NULL) AND (Measure_ID LIKE '%O%')
                                              GROUP BY Goal_Abbreviation, Member_ID) AS A_1 ON tab.Member_ID = A_1.new_memid
                                               AND tab.Reporting_Period_ID = A_1.Curr_Quarter AND 
                                         tab.Goal_Abbreviation = A_1.new_measure) AS C ON B.Member_ID = C.Member_ID 




 WHERE  (B.Goal_Abbreviation = C.Goal_Abbreviation) )  E ON D.Member_Id = E.Member_ID AND d.Domain = E.S_Domain 

ORDER BY D.Domain,D.Member_ID 

如何将每个member_ID的&#39; yes&#39; /(count(yes)+ count(no))计数为column1,并显示每个member_ID对所有member_ID的排名结果为column2。我已经提出了一个生成整个表的计数的查询,但是如何限制每个Member_ID。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我还没有花时间来消化你提供的查询,但如果抽象出在每一行上重复一系列数据的概念,你应该看一下使用窗口函数。还有其他方法,例如使用CTE进行聚合,然后再加入到详细数据中。对于更复杂的计算,这可能会更好,但窗口函数可以说是更优雅的选项。

DECLARE @MasterData AS TABLE 
(
    MemberID varchar(50),
    MemberAnswer int 
);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jim', 1);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jim', 0);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jim', 1);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jim', 1);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jane', 1);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jane', 0);
INSERT INTO @MasterData (MemberID, MemberAnswer) VALUES ('Jane', 1);

-- Method 1, using windowing functions (preferred for performance and syntactical compactness)
SELECT
    MemberID,
    MemberAnswer,
    CONVERT(numeric(19,4),SUM(MemberAnswer) OVER (PARTITION BY MemberID)) / CONVERT(numeric(19,4),COUNT(MemberAnswer) OVER (PARTITION BY MemberID)) AS PercentYes
FROM        @MasterData;

-- Method 2, using a CTE

WITH MemberSummary AS
(
    SELECT
        MemberID,
        SUM(MemberAnswer) AS MemberYes,
        COUNT(MemberAnswer) AS MemberTotal
    FROM        @MasterData
    GROUP BY    MemberID
)
SELECT
    md.MemberID,
    md.MemberAnswer,
    CONVERT(numeric(19,4),MemberYes) / CONVERT(numeric(19,4),MemberTotal) AS PercentYes
FROM        @MasterData md
JOIN        MemberSummary ms
ON          md.MemberID = ms.MemberID;

答案 1 :(得分:0)

首先想到的是:你的查询太复杂了。我花了大约10分钟时间试图理解它并且没有任何进展,所以它显然会给你组织内部的人带来长期的维护挑战。我真的建议你尝试找一些简化它的方法。

也就是说,这是一个简化的一般示例,说明如何查询计算值并对结果进行排名:

CREATE TABLE member (member_id INT PRIMARY KEY);

CREATE TABLE master_data (
  transaction_id INT PRIMARY KEY, 
  member_id INT FOREIGN KEY REFERENCES member(member_id),
  received_data BIT
);

-- INSERT data here

; WITH member_data_counts AS (
  SELECT 
    m.member_id, 
    (SELECT COUNT(*) FROM master_data d WHERE d.member_id = m.member_id AND d.received_data = 1) num_yes, 
    (SELECT COUNT(*) FROM master_data d WHERE d.member_id = m.member_id AND d.received_data = 0) num_no
  FROM member m
), member_data_calc AS (
  SELECT 
    *, 
    CASE 
      WHEN (num_yes + num_no) = 0 THEN NULL  -- avoid division-by-zero error
      ELSE num_yes / (num_yes + num_no)
    END pct_yes
  FROM member_data_counts 
), member_data_rank AS (
  SELECT *, RANK() OVER (ORDER BY pct_yes DESC) AS RankValue
  FROM member_data_calc
) 
SELECT * 
FROM member_data_rank
ORDER BY RankValue ASC;