2013-04-17 38 views
1

此查詢迫使我將f.CONCEPT_CD放入group by子句中,因爲我在select子句中的case語句中使用了它。如何在結果集中保留計數,而不重複使用相同f.PATIENT_NUM的記錄?請注意下面的屏幕快照中PATIENT_NUM = 5是如何重複的。我只想顯示一個記錄,如果PATIENT_NUM = 5如何獲得聚合計數而不重複group by子句中的第一列?

SELECT 
    f.PATIENT_NUM, 
    CASE WHEN f.CONCEPT_CD = 'BIO|HGT' THEN COUNT(NVAL_NUM) ELSE 0 END AS 'HEIGHT', 
    CASE WHEN f.CONCEPT_CD = 'BIO|WGT' THEN COUNT(NVAL_NUM) ELSE 0 END AS 'WEIGHT', 
    CASE WHEN f.CONCEPT_CD = 'BIO|BMI' THEN COUNT(NVAL_NUM) ELSE 0 END AS 'BMI', 
    CASE WHEN f.CONCEPT_CD = 'BIO|DIA' THEN COUNT(NVAL_NUM) ELSE 0 END AS 'DIA', 
    CASE WHEN f.CONCEPT_CD = 'BIO|SYS' THEN COUNT(NVAL_NUM) ELSE 0 END AS 'SYS' 
    FROM [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_OBSERVATION_FACT] f 
    JOIN [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_CONCEPT_DIMENSION] d ON f.CONCEPT_CD = d.CONCEPT_CD 
    GROUP BY f.PATIENT_NUM, f.CONCEPT_CD 

enter image description here

回答

3
SELECT f.PATIENT_NUM, 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|HGT' THEN 1 END) AS 'HEIGHT', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|WGT' THEN 1 END) AS 'WEIGHT', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|BMI' THEN 1 END) AS 'BMI', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|DIA' THEN 1 END) AS 'DIA', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|SYS' THEN 1 END) AS 'SYS' 
FROM [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_OBSERVATION_FACT] f 
     INNER JOIN [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_CONCEPT_DIMENSION] d 
      ON f.CONCEPT_CD = d.CONCEPT_CD 
GROUP BY f.PATIENT_NUM 

您也可以使用它在SQL Server支持PIVOT()

SELECT PATIENT_NUM, 
     [BIO|HGT] AS 'HEIGHT', 
     [BIO|WGT] AS 'WEIGHT', 
     [BIO|BMI] AS 'BMI', 
     [BIO|DIA] AS 'DIA', 
     [BIO|SYS] AS 'SYS' 
FROM 
    (
     SELECT f.PATIENT_NUM, f.CONCEPT_CD 
     FROM [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_OBSERVATION_FACT] f 
       INNER JOIN [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_CONCEPT_DIMENSION] d 
        ON f.CONCEPT_CD = d.CONCEPT_CD 
    ) org 
    PIVOT 
    (
     COUNT(*) 
     FOR PATIENT_NUM IN ([BIO|HGT],[BIO|WGT],[BIO|BMI], 
          [BIO|DIA],[BIO|SYS]) 
    ) pvt 

UPDATE 1

SELECT f.PATIENT_NUM, 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|HGT' THEN 1 END) AS 'HEIGHT', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|WGT' THEN 1 END) AS 'WEIGHT', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|BMI' THEN 1 END) AS 'BMI', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|DIA' THEN 1 END) AS 'DIA', 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|SYS' THEN 1 END) AS 'SYS' 
FROM [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_OBSERVATION_FACT] f 
     INNER JOIN [HIMC_I2B2_LZ-PROD].[dbo].[I2B2_CONCEPT_DIMENSION] d 
      ON f.CONCEPT_CD = d.CONCEPT_CD 
GROUP BY f.PATIENT_NUM 
HAVING COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|HGT' THEN 1 END) > 0 AND 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|WGT' THEN 1 END) > 0 AND 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|BMI' THEN 1 END) > 0 AND 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|DIA' THEN 1 END) > 0 AND 
     COUNT(CASE WHEN f.CONCEPT_CD = 'BIO|SYS' THEN 1 END) > 0 
+0

但我不想NVAL_NUM的值,我想記錄的計數。 – MacGyver

+0

看到我更新的答案。 –

+0

不錯!有沒有辦法只顯示所有聚合別名列的計數> 0的記錄? – MacGyver

相關問題