2012-10-23 56 views
1

我的查询返回的数据集,看起来像这样:如何从枢轴聚合值?

+-----------+--------+-----------+-------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+---------+------------+--------+---------+------------+---------+---------+------------+--------+ 
| CLIENT_ID | count1 | TestFreq1 | stdv1 | count2 | TestFreq2 | stdv2 | count3 | TestFreq3 | stdv3 | count4 | TestFreq4 | stdv4 | count5 | TestFreq5 | stdv5 | count6 | TestFreq6 | stdv6 | count7 | TestFreq7 | stdv7 | count8 | TestFreq8 | stdv8 | count9 | TestFreq9 | stdv9 | count10 | TestFreq10 | stdv10 | count11 | TestFreq11 | stdv11 | count12 | TestFreq12 | stdv12 | 
+-----------+--------+-----------+-------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+---------+------------+--------+---------+------------+---------+---------+------------+--------+ 
| 210893 | 136 |   0 |  0 |  81 |  41 | 79.2685 |  19 |  63 | 58.321 |  24 |  21 | 20.4896 |  5 |  25 | 8.228 |  6 |  24 | 24.0638 |  4 |  25 | 24.6103 | 2  | 25  | 2.12132 |  2 |  23 | 21.9203 | 1  | 33   | NULL |  2 |   29 | 7.77817 | 1  | 38   | NULL | 
| 123321 |  50 |   0 |  0 |  5 |  26 | 7.87401 |  14 |  45 | 51.8002 |  3 |  25 | 14.7422 |  2 |  22 | 17.6777 |  4 |  36 | 21.4942 |  3 |  36 | 22.2711 | NULL | NULL  | NULL |  4 |  35 | 9.30949 | NULL | NULL  | NULL |  1 |   31 | NULL | NULL | NULL  | NULL | 
| 454322 | 232 |   0 |  0 | 173 |  10 | 33.8487 |  36 |  36 | 36.6602 |  32 |  15 | 17.485 |  10 |  38 | 22.4809 |  13 |  23 | 20.0477 |  7 |  18 | 11.4143 | 3  | 32  | 24.5425 |  6 |  25 | 16.8602 | 3  | 28   | 21.166 |  2 |   25 | 4.94975 | 1  | 34   | NULL | 
+-----------+--------+-----------+-------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+--------+-----------+---------+---------+------------+--------+---------+------------+---------+---------+------------+--------+ 

,而不是强迫的数据出去count13, stdv13, testfreq13, ..14..14..14, 15.15.15我怎么能在同一领域聚集所有的值12及以上?

这里是我的查询,非常感谢你的指点:

;WITH counted AS (
    SELECT 
    client_id, 
    COUNT(*) AS TimesTested, 
    (datediff(day,MIN(received_date),max(received_date))) 
    /COUNT(*) as TestFreq 
    FROM f_accession_daily 
    GROUP BY 
    client_id, 
    patient_id 
), 
counted2 as (
    SELECT 
    client_id, 
    TimesTested, 
    CAST(COUNT(*) AS varchar(30)) AS count, 
    CAST(AVG(testfreq) as varchar(30)) as TestFreq, 
    CAST(STDEV(TestFreq) as varchar(30)) Stdv 
    FROM counted 
    GROUP BY 
    client_id, 
    TimesTested 
    ) 
    , 
unpivoted AS (
    SELECT 
    client_id, 
    ColumnName + CAST(TimesTested AS varchar(10)) AS ColumnName, 
    ColumnValue 
    FROM counted2 
    UNPIVOT (
    ColumnValue FOR ColumnName IN (count, TestFreq,stdv) 
) u 
), 
pivoted AS (
    SELECT 
    client_id clientid, 
    count1, TestFreq1,stdv1, 
    count2, TestFreq2,stdv2, 
    count3, TestFreq3,stdv3, 
    count4, TestFreq4,stdv4, 
    count5, TestFreq5,stdv5, 
    count6, TestFreq6,stdv6, 
    count7, TestFreq7,stdv7, 
    count8, TestFreq8,stdv8, 
    count9, TestFreq9,stdv9, 
    count10, TestFreq10,stdv10, 
    count11, TestFreq11,stdv11, 
    count12, TestFreq12,stdv12 
    FROM unpivoted 
    PIVOT (
    MAX(ColumnValue) FOR ColumnName IN (
     count1,TestFreq1,stdv1, 
     count2,TestFreq2,stdv2, 
     count3,TestFreq3,stdv3, 
     count4,TestFreq4,stdv4, 
     count5,TestFreq5,stdv5, 
     count6,TestFreq6,stdv6, 
     count7,TestFreq7,stdv7, 
    count8, TestFreq8, stdv8, 
    count9, TestFreq9, stdv9, 
    count10, TestFreq10,stdv10, 
    count11, TestFreq11,stdv11, 
    count12, TestFreq12,stdv12 
    ) 
) p 
) 
select * from pivoted 

只是为了澄清我想回到同一个确切的结果,它只是在过去的专栏中,我想要聚合的所有值那落入12+ bucket。所有的领域都将是除了最后三个相同的,这将是:

+----------+-------------+---------+ 
| count12+ | TestFreq12+ | stdv12+ | 
+----------+-------------+---------+ 
| 353  | 32423  | NULL | 
| NULL  | NULL  | NULL | 
| 342  | 25324  | NULL | 
+----------+-------------+---------+ 

请注意相较于其他,因为12+已经汇总上面的更大的数字。

非常感谢你的指导!

+3

难道你只需要改变你的CTE'counted2'所以列'TimesTested'是这样的:'CASE WHEN TimesTested> = 12 THEN ELSE 12 TimesTested END'? – Lamak

+0

谢谢!我是否需要对主键进行更改? –

+3

@АртёмЦарионов-你为什么不尝试;-) – Lamak

回答

3

看起来最快的方法就是改变你的CTE,所以TimesTested这一列将你的逻辑考虑在内。因此,它应该是:

counted2 as (
    SELECT 
    client_id, 
    CASE WHEN TimesTested >= 12 THEN 12 ELSE TimesTested END TimesTested, 
    CAST(COUNT(*) AS varchar(30)) AS count, 
    CAST(AVG(testfreq) as varchar(30)) as TestFreq, 
    CAST(STDEV(TestFreq) as varchar(30)) Stdv 
    FROM counted 
    GROUP BY 
    client_id, 
    CASE WHEN TimesTested >= 12 THEN 12 ELSE TimesTested END 
    ) 
+0

谢谢!你不同意@andriy? –

+0

@АртёмЦарионов - 并非如此。由于这些是CTE,而不是物理表格,我不认为改变第一个CTE会带来好处。我懒惰的人喜欢改变第二个CTE,因为我不必使用'CASE当COUNT(*)..',我可以直接使用colum的名字。 (请注意,如果这些是物理表或临时表,这可能会有所不同) – Lamak

+0

@Lamak:有趣的是,我的推理可能与您的理由非常相似,除了我认为将COUNT(*)'写为TimesTested'比较容易,因为前者较短。 :)但是,严肃地说,在这种情况下我看不出什么区别,你的选择绝不比我的更糟。 –