2012-12-29 40 views
0

我只有一列SQL Server 2012的組只有一列

SQL Server 2012的查詢需要組:

SELECT OrderID,Status,DateEdited 
FROM orders 
WHERE Status='Pending' 
GROUP BY OrderID,Status,DateEdited 

,其結果是:

enter image description here

由於您可以看到有重複的OrderId列值。

作品,但它按OrderId,Status,DateEdit但我需要的是,OrderId將在結果唯一我能有這樣的事情:

SELECT OrderID,Status,DateEdited 
FROM orders 
WHERE Status='Pending' 
GROUP BY OrderID 
+1

應該挑選其他兩個字段的值? – Mat

+1

這些行不是**重複** - 它們的值不同...... –

回答

4

您必須使用statusDateEdited的聚合函數才能爲每個分組的ORDERID獲得不同的瓦倫。您還可以使用排序功能,這樣做是這樣的:

WITH CTE 
AS 
(
    SELECT 
    OrderID, 
    Status, 
    DateEdited, 
    ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY DateEdited DESC) rownum 
    FROM orders 
    WHERE Status='Pending' 
) 
SELECT 
    OrderID, 
    Status, 
    DateEdited 
FROM CTE 
WHERE rownum = 1; 

這會給你不同的ORDERID秒。但是哪個狀態和DateEdited爲每個分組ORDERID返回?

+0

更合理的假設是採取最近編輯的值,而不是最早的編輯值。 –

+0

查詢是相當大的一個,但它也適用謝謝。 – AirWolf

+0

@GordonLinoff - 對不起,現在修復謝謝。 –

1

然後你就可以像這樣,

SELECT OrderID,'Pending' as Status,max(DateEdited) 
FROM orders 
WHERE Status='Pending' 
GROUP BY OrderID 

如果你不想失去任何記錄,那麼你可以去 GROUP_CONCAT()

SELECT OrderID,'Pending' as Status,GROUP_CONCAT(DateEdited) 
FROM orders 
WHERE Status='Pending' 
GROUP BY OrderID 

注意:我不確定您是否在sqlserver中使用GROUP_CONCAT因爲它不存在 需要這樣的功能。 :)

+0

感謝這是一個簡單的查詢,它的工作原理 – AirWolf