简体   繁体   English

无法旋转此数据

[英]Having trouble pivoting this data

MS Server 2012微软服务器 2012

The following query returns the correct data but i need to pivot it and my attempts are failing, any hep would be appreciated..以下查询返回正确的数据,但我需要 pivot 它并且我的尝试失败了,任何 hep 将不胜感激..

Query...询问...

SELECT TrialSampleID, ReferenceReadID, Reference_Antibiotic, CONCAT(Reference_Qualifier, ' ', Reference_MIC, ' ug/ml') AS 'MIC' FROM dbo.ClinicalTrial JOIN dbo.ReferenceDataPointers ON ClinicalTrial.ID = ReferenceDataPointers.ClinicalTrialID JOIN dbo.ReferencePlates ON ReferenceDataPointers.ReferenceSetID = ReferencePlates.ReferenceSetID JOIN dbo.ReferenceReads ON ReferencePlates.ID = ReferenceReads.ReferencePlateID JOIN dbo.ReferenceMICs ON ReferenceReads.ID = ReferenceMICs.ReferenceReadID WHERE TrialSampleID NOT LIKE 'REF-%' AND SpecimenSource LIKE 'Clinical%' AND Reference_ValidAntibiotic = 'True ' SELECT TrialSampleID, ReferenceReadID, Reference_Antibiotic, CONCAT(Reference_Qualifier, ' ', Reference_MIC, ' ug/ml') AS 'MIC' FROM dbo.ClinicalTrial JOIN dbo.ReferenceDataPointers ON ClinicalTrial.ID = ReferenceDataPointers.ClinicalTrialID JOIN dbo.ReferencePlates ON ReferenceDataPointers.ReferenceSetID = ReferencePlates.ReferenceSetID JOIN dbo.ReferenceReads ON ReferencePlates.ID = ReferenceReads.ReferencePlateID JOIN dbo.ReferenceMICs ON ReferenceReads.ID = ReferenceMICs.ReferenceReadID WHERE TrialSampleID NOT LIKE 'REF-%' AND SpecimenSource LIKE 'Clinical%' AND Reference_ValidAntibiotic = 'True '

Result...结果...

TrialSampleID |ReferenceReadID |Reference_Antibiotic          |MIC          
CC-200001     | 4077           |Amikacin                      | = 8 ug/ml
CC-200001     | 4077           |Ampicillin                    | > 64 ug/ml
CC-200001     | 4077           |Aztreonam                     | > 64 ug/ml
CC-200001     | 4077           |Cefazolin                     | > 16 ug/ml
CC-200001     | 4077           |Cefepime                      | = 64 ug/ml
CC-200001     | 4077           |Ceftazidime                   | > 64 ug/ml
CC-200001     | 4077           |Ceftazidime/Avibactam         | ≤ 2 ug/ml
CC-200001     | 4077           |Ertapenem                     | ≤ 0.125 ug/ml
CC-200001     | 4077           |Gentamicin                    | > 32 ug/ml
CC-200001     | 4077           |Levofloxacin                  | = 8 ug/ml
CC-200001     | 4077           |Meropenem                     | ≤ 0.125 ug/ml
CC-200001     | 4077           |Meropenem/Vaborbactam         | ≤ 0.5 ug/ml
CC-200001     | 4077           |Piperacillin/Tazobactam       | = 128 ug/ml
CC-200001     | 4077           |Trimethoprim/Sulfamethoxazole | > 8 ug/ml

The block repeats 6 times for each TrialSampleID giving 6 MICs该块对每个 TrialSampleID 重复 6 次,给出 6 个 MIC

I would like the data in the following form but end up with NULL in the MIC column when i pivot the data.我想要以下形式的数据,但当我使用 pivot 数据时,MIC 列中的数据最终为 NULL。

Desired...想要...

TrialSampleID |ReferenceReadID |Reference_Antibiotic          |MIC1             |MIC2               |MIC3
CC-200001     | 4077           |Amikacin                      | = 8 ug/ml       |   = 8 ug/ml       |   = 8 ug/ml
CC-200001     | 4077           |Ampicillin                    | > 64 ug/ml      |   > 64 ug/ml      |   > 64 ug/ml
CC-200001     | 4077           |Aztreonam                     | > 64 ug/ml      |   > 64 ug/ml      |   > 64 ug/ml
CC-200001     | 4077           |Cefazolin                     | > 16 ug/ml      |   > 16 ug/ml      |   > 16 ug/ml
CC-200001     | 4077           |Cefepime                      | = 64 ug/ml      |   = 64 ug/ml      |   = 64 ug/ml
CC-200001     | 4077           |Ceftazidime                   | > 64 ug/ml      |   > 64 ug/ml      |   > 64 ug/ml
CC-200001     | 4077           |Ceftazidime/Avibactam         | ≤ 2 ug/ml       |   ≤ 2 ug/ml       |   ≤ 2 ug/ml
CC-200001     | 4077           |Ertapenem                     | ≤ 0.125 ug/ml   |   ≤ 0.125 ug/ml   |   ≤ 0.125 ug/ml
CC-200001     | 4077           |Gentamicin                    | > 32 ug/ml      |   > 32 ug/ml      |   > 32 ug/ml
CC-200001     | 4077           |Levofloxacin                  | = 8 ug/ml       |   = 8 ug/ml       |   = 8 ug/ml
CC-200001     | 4077           |Meropenem                     | ≤ 0.125 ug/ml   |   ≤ 0.125 ug/ml   |   ≤ 0.125 ug/ml
CC-200001     | 4077           |Meropenem/Vaborbactam         | ≤ 0.5 ug/ml     |   ≤ 0.5 ug/ml     |   ≤ 0.5 ug/ml
CC-200001     | 4077           |Piperacillin/Tazobactam       | = 128 ug/ml     |   = 128 ug/ml     |   = 128 ug/ml
CC-200001     | 4077           |Trimethoprim/Sulfamethoxazole | > 8 ug/ml       |   > 8 ug/ml       |   > 8 ug/ml

tried...试过...

PIVOT(  
    MIN(ReferenceReadID)
    FOR MIC IN (
                MIC1,
                MIC2,
                MIC3,
                MIC4,
                MIC5,
                MIC6
                )   
    ) pivoted

You can try to use condition aggregate function to make it.您可以尝试使用条件聚合 function 来制作。

CASE WHEN with MAX function.使用MAX CASE WHEN时的情况。

SELECT  TrialSampleID,
        ReferenceReadID,
        Reference_Antibiotic,
        MAX(CASE WHEN rn = 1 THEN MIC END) 'MIC1',
        MAX(CASE WHEN rn = 2 THEN MIC END) 'MIC2',
        MAX(CASE WHEN rn = 3 THEN MIC END) 'MIC3',
        MAX(CASE WHEN rn = 4 THEN MIC END) 'MIC4',
        MAX(CASE WHEN rn = 5 THEN MIC END) 'MIC5',
        MAX(CASE WHEN rn = 6 THEN MIC END) 'MIC6'
FROM (
SELECT 
    TrialSampleID,
    ReferenceReadID,
    Reference_Antibiotic,
    CONCAT(Reference_Qualifier, ' ', Reference_MIC, ' ug/ml') AS 'MIC',
    ROW_NUMBER() OVER(PARTITION BY TrialSampleID,ReferenceReadID,Reference_Antibiotic ORDER BY Reference_Antibiotic) rn
FROM 
    dbo.ClinicalTrial
    JOIN dbo.ReferenceDataPointers ON ClinicalTrial.ID = ReferenceDataPointers.ClinicalTrialID
    JOIN dbo.ReferencePlates ON ReferenceDataPointers.ReferenceSetID = ReferencePlates.ReferenceSetID
    JOIN dbo.ReferenceReads ON ReferencePlates.ID = ReferenceReads.ReferencePlateID
    JOIN dbo.ReferenceMICs ON ReferenceReads.ID = ReferenceMICs.ReferenceReadID
WHERE 
    TrialSampleID NOT LIKE 'REF-%' 
    AND SpecimenSource LIKE 'Clinical%'
    AND Reference_ValidAntibiotic = 'True'
) t1

Result...结果...

CC-200004   |4089   |Ertapenem  |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml
CC-200004   |4086   |Ertapenem  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml
CC-200004   |4087   |Ertapenem  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml
CC-200004   |4088   |Ertapenem  |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml   |= 0.25 ug/ml
CC-200004   |4085   |Ertapenem  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml
CC-200004   |4084   |Ertapenem  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |≤ 0.125 ug/ml

Desired...想要...

CC-200004   |4089   |Ertapenem  |= 0.25 ug/ml   |≤ 0.125 ug/ml  |≤ 0.125 ug/ml  |= 0.25 ug/ml   |≤ 0.125 ug/ml  |≤ 0.125 ug/ml

This solved it, Thandk D-Shih for the insight...这解决了它,感谢 D-Shih 的洞察力......

SELECT  TrialSampleID,
        Reference_Antibiotic,
        MAX(CASE WHEN rn = 1 THEN MIC END) 'MIC1',
        MAX(CASE WHEN rn = 2 THEN MIC END) 'MIC2',
        MAX(CASE WHEN rn = 3 THEN MIC END) 'MIC3',
        MAX(CASE WHEN rn = 4 THEN MIC END) 'MIC4',
        MAX(CASE WHEN rn = 5 THEN MIC END) 'MIC5',
        MAX(CASE WHEN rn = 6 THEN MIC END) 'MIC6'
FROM (
        SELECT 
            TrialSampleID,
            Reference_Antibiotic,
            CONCAT(Reference_Qualifier, ' ', Reference_MIC, ' ug/ml') AS 'MIC',
            ROW_NUMBER() OVER(PARTITION BY TrialSampleID, Reference_Antibiotic ORDER BY TrialSampleID, Reference_Antibiotic) rn
        FROM 
            dbo.ClinicalTrial
            JOIN dbo.ReferenceDataPointers ON ClinicalTrial.ID = ReferenceDataPointers.ClinicalTrialID
            JOIN dbo.ReferencePlates ON ReferenceDataPointers.ReferenceSetID = ReferencePlates.ReferenceSetID
            JOIN dbo.ReferenceReads ON ReferencePlates.ID = ReferenceReads.ReferencePlateID
            JOIN dbo.ReferenceMICs ON ReferenceReads.ID = ReferenceMICs.ReferenceReadID
        WHERE 
            TrialSampleID NOT LIKE 'REF-%' 
            AND SpecimenSource LIKE 'Clinical%'
            AND Reference_ValidAntibiotic = 'True'
    ) t1
GROUP BY TrialSampleID, Reference_Antibiotic
ORDER BY TrialSampleID, Reference_Antibiotic

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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