2014-03-27 26 views
0

這裏是我的Count_query:加入對數和排名結果牛逼SQL

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/(@[email protected]_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 

如何獲得「是」 /(COUNT(是)+計數(否)),每個member_ID爲列1的數,也顯示每個member_ID軍銜反對的結果作爲COLUMN2所有member_IDs。我想出了一個查詢來生成整個表的計數,但是我怎麼限制它的每個Member_ID。

感謝您的幫助。

回答

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; 
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;