如何根据两列过滤sql表中的多行

时间:2015-10-12 14:11:52

标签: sql-server

ID     |Number|Qty|OrderNumber|Date
456-98A|746-96|0.1|00         |2015-01-01
456-98A|746-96|0.1|00         |2015-01-01
456-98A|746-96|0.1|00         |2015-01-01
456-98A|746-96|0.1|00         |2015-01-01
456-98A|321-96|0.3|05         |2015-01-01
456-98A|321-96|0.3|05         |2015-01-01

sql中的上表给了我多个相同ID的行。我如何过滤这些数据,这样如果Number和orderNumber相同,那么它必须只为我提供一行而不是多个值。例如预期结果将是

ID     |Number|Qty|OrderNumber|Date
456-98A|746-96|0.1|00         |2015-01-01
456-98A|321-96|0.3|05         |2015-01-01

3 个答案:

答案 0 :(得分:1)

您可以按需要或全部或不同的列进行分组。

select ID, Number, Qty, OrderNumber, Date from YourTable
group by ID, Number, Qty, OrderNumber, Date

答案 1 :(得分:0)

您可以ROW_NUMBER()使用PARTITION BY这样的

<强> SQL Fiddle

<强>查询

SELECT ID, Number,Qty,OrderNumber,Date
FROM 
(
SELECT ID, Number,Qty,OrderNumber,Date,ROW_NUMBER()OVER(PARTITION BY Number, orderNumber ORDER BY ID ) as rn
FROM yourTable
)yourTable
WHERE rn = 1

示例数据

CREATE TABLE yourTable
    ([ID] varchar(7), [Number] varchar(6), [Qty] int, [OrderNumber] int, [Date] datetime);

INSERT INTO yourTable
    ([ID], [Number], [Qty], [OrderNumber], [Date])
VALUES
    ('456-98A', '746-96', 0.1, 00, '2015-01-01 00:00:00'),
    ('456-98A', '746-96', 0.1, 00, '2015-01-01 00:00:00'),
    ('456-98A', '746-96', 0.1, 00, '2015-01-01 00:00:00'),
    ('456-98A', '746-96', 0.1, 00, '2015-01-01 00:00:00'),
    ('456-98A', '321-96', 0.3, 05, '2015-01-01 00:00:00'),
    ('456-98A', '321-96', 0.3, 05, '2015-01-01 00:00:00');

<强>输出

ID  Number  Qty OrderNumber Date
456-98A 321-96  0   5   2015-01-01 00:00:00.000
456-98A 746-96  0   0   2015-01-01 00:00:00.000

答案 2 :(得分:0)

如果您可以使用临时表,则可以执行以下操作:

MeasureUnit

并获得正确的行:

CREATE TABLE #tempo
  ([rowNum] identity, [ID] varchar(7), [Number] varchar(6), [Qty] int, [OrderNumber] int, [Date] datetime); 

INSERT INTO #tempo ([ID], [Number], [Qty], [OrderNumber], [Date])
SELECT [ID], [Number], [Qty], [OrderNumber], [Date] FROM yourtable