2014-05-13 42 views
0

看起来很容易。行级别不同

我通过使用COALESCE获得下表。我需要在行级别执行不同的操作。

1 1 5 5 5 (null) 
2 2 2 2 25 25 
3 7 35 35 35 35 

这就是我正在寻找的。

1 5 null 
2 25 
3 7 35 

这里有http://sqlfiddle.com/#!3/e945b/5/0

+1

我想不出一个很好的方法来实现这一目标,部分原因是我无法想象为什么地球上你会想要返回一个数据集,比如你提到的。多一点解释可能会帮助我们帮助你。 –

+0

您可能需要[将行转换为列](http://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server-2008),然后使用“DISTINCT”。 –

+0

不好意思问一个难题。它从最终报告中删除了太多垃圾。 – sqlint

回答

2

演示这是我能想到这样做的唯一途径。 目前没有足够的时间来解释其操作,因此请在评论中发帖提问;

WITH DataCTE (RowID, a, b, c, d, e, f) AS 
(
    SELECT 1, 1, 1, 5, 5, 5, NULL UNION ALL 
    SELECT 2, 2, 2, 2, 2, 25, 25 UNION ALL 
    SELECT 3, 3, 7, 35, 35, 35, 35 
) 
,UnPivotted AS 
(
    SELECT DC.RowID 
      ,CA.Distinctcol 
      ,OrdinalCol = ROW_NUMBER() OVER (PARTITION BY DC.RowID ORDER BY CA.Distinctcol) 
    FROM DataCTE DC 
    CROSS 
    APPLY (
       SELECT Distinctcol 
       FROM 
       (
        SELECT Distinctcol = a UNION 
        SELECT b UNION 
        SELECT c UNION 
        SELECT d UNION 
        SELECT e UNION 
        SELECT f  
       )DT 
       WHERE Distinctcol IS NOT NULL 

      )  CA(Distinctcol) 
) 
SELECT RowID 
     ,Col1 = MAX(CASE WHEN OrdinalCol = 1 THEN Distinctcol ELSE NULL END) 
     ,Col2 = MAX(CASE WHEN OrdinalCol = 2 THEN Distinctcol ELSE NULL END) 
     ,Col3 = MAX(CASE WHEN OrdinalCol = 3 THEN Distinctcol ELSE NULL END) 
     ,Col4 = MAX(CASE WHEN OrdinalCol = 4 THEN Distinctcol ELSE NULL END) 
     ,Col5 = MAX(CASE WHEN OrdinalCol = 5 THEN Distinctcol ELSE NULL END)     
FROM UnPivotted 
GROUP BY RowID 
+0

谢谢MarkD。这正是我需要的。 WITH DataCTE中需要RowID列(RowID,a,b,c,d,e,f)? – sqlint

+0

不客气。是的,因为它在'GROUP BY'中使用 – MarkD

+2

您可以使用'ROW_NUMBER()'人工制造RowID – MarkD