2015-08-28 41 views
-1

我有一个海量数据拉,我有四个键我想特别能够排序。T-SQL顶部X,所有其他 - 多个约束

pk.Formula.SPEEDCODE 
pk.Formula.THERAPEUTIC_CLASS 
pk.RxFill.PATIENT_PRICE 
pk.RxFill.SHIP_DATE 

从本质上讲,每个THERAPEUTIC_CLASS,我希望能够通过总和(PATIENT_PRICE)中拉顶级X(其中X将分别为每THERAPEUTIC_CLASS定义)SPEEDCODES(必须以字母数字字符开始)一个与之前的星期一至星期日(SHIP_DATE)相对应的特定时间段,然后我想将每个THERAPEUTIC_CLASS的所有其余元素列为“所有其他”。

我以为我早就想通了,但是拉一次6分钟,我不想等那么久。帮帮我?

示例代码:

THERAPEUTIC_CLASS SPEEDCODE PATIENT_PRICE 
Pain    M1   500.00 
Pain    NULL  125.00 
Pain       85.00 
Pain    M1   225.00 
Pain    P3   600.00 
Pain    M1   1000.00 
Pain    P3   500.00 
Pain    P5   600.00 
Pain    NULL  85.00 
Pain    P5   450.00 
Derm    WART1  250.00 
Derm    U2   125.00 
Derm    NULL  225.00 
Derm    WART1  500.00 
Derm    U2   85.00 
Derm       50.00 

预期输出(排序):

TxClass Speedcode Revenue 
Pain  M1   1775.00 
Pain  P3   1100.00 
Pain  P5   1050.00 
Pain  All Other 295.00 
Derm  WART1  750.00 
Derm  U2   210.00 
Derm  All Other 275.00 
+0

请提出问题的样本数据和预期输出。 –

+0

那么,你的工作代码太慢了? – Blorgbeard

+0

我的半工作代码太慢了,但是我弄错了,因为它没有正确处理NULL /空值。我只想让代码捕获以字母数字开头的东西,而我的代码捕获非字母数字速度码。 –

回答

0

可能是通过看上面的问题和意见正是我不知道确切的输出,你正在寻找。 我假设的答案,如果它适合你。

;with CTE AS (
select 
THERAPEUTIC_CLASS, 
    CASE WHEN speedcode IS NULL THEN 'All Other' 
     ELSE SpeedCode END AS SpeedCode, 
    sum(PATIENT_PRICE) As PATIENT_PRICE, 
     ROW_number()OVER(PARTITION BY THERAPEUTIC_CLASS 
      ORDER BY THERAPEUTIC_CLASS desc)RN 
    from table1 
     GROUP BY THERAPEUTIC_CLASS,speedcode) 

     Select THERAPEUTIC_CLASS, 
    SpeedCode, 
    PATIENT_PRICE 
    from CTE 
     ORDER BY THERAPEUTIC_CLASS DESC,RN DESC