2011-09-29 45 views
6

Tôi đang sử dụng SQL Server 2008;Nhận giá trị tối thiểu giữa một số cột

Giả sử tôi có một bảng 'X' với các cột 'Ngày1', 'Ngày 2', 'Dateblah', tất cả kiểu DateTime.

Tôi muốn chọn giá trị min giữa ba cột, ví dụ (giản thể, với ngày dd/mm/yyyy)

ID  Date1   Date2   Dateblah 
0  09/29/2011  09/20/2011  09/01/2011 
1  01/01/2011  01/05/2011  03/03/2010 

ID MinDate 
0 09/01/2011 
1 03/03/2010 

Có bánh mì và bơ lệnh để làm điều đó?

Xin cảm ơn trước.

EDIT: Tôi đã nhìn thấy câu hỏi này What's the best way to select the minimum value from several columns? nhưng tiếc là nó sẽ không phù hợp với tôi vì tôi bị buộc phải làm điều đó chống lại bình thường hóa vì tôi đang làm báo cáo mục công việc tfs và trường hợp 'brute-force' điều sẽ kết thúc là một nỗi đau nếu tôi có 6 ou 7 cột.

Trả lời

5

Không có hàm được tích hợp để trả lại phút/tối đa của hai (hoặc nhiều) cột. Bạn có thể thực hiện chức năng vô hướng của riêng bạn để làm điều này.

Trong SQL Server 2005 + bạn có thể sử dụng UNPIVOT để biến các cột thành hàng và sau đó sử dụng chức năng MIN:

CREATE TABLE [X] 
(
    [ID] INT, 
    [Date1] DATETIME, 
    [Date2] DATETIME, 
    [Date3] DATETIME 
) 

INSERT [X] 
VALUES (0, '09/29/2011', '09/20/2011', '09/01/2011'), 
     (1, '01/01/2011', '01/05/2011', '03/03/2010') 


SELECT [ID], MIN([Date]) AS [MinDate] 
FROM [X] 
UNPIVOT (
    [Date] FOR d IN 
     ([Date1] 
     ,[Date2] 
     ,[Date3]) 
) unpvt 
GROUP BY [ID] 
+0

Cảm ơn bạn, nó hoạt động hoàn hảo, tôi sẽ đánh dấu câu trả lời ngay khi có thể –

+0

Tôi vừa thử chạy mã này trên máy chủ của mình (SQL SErver 2008 R2) và nhận được lỗi liên quan đến câu lệnh cuối cùng . "Cú pháp không chính xác gần 'Ngày'." –

+0

Tôi không chắc tại sao bạn lại nhận được điều này. Bạn có đang chạy tập lệnh thông qua SQL Server Management Studio không? Tôi chỉ thử nó một lần nữa chống lại một trường hợp 2008 R2 và nó hoạt động tốt cho tôi .. –

1

Thực hiện một hàm vô hướng:

CREATE FUNCTION [dbo].[MIN](@a SQL_VARIANT, @b SQL_VARIANT) 
RETURNS SQL_VARIANT 
AS 
BEGIN 
    RETURN (
     SELECT MIN([x]) 
     FROM (VALUES(@a),(@b)) x([x]) 
    ) 
END 
GO 

DECLARE @a DATETIME = '12 JUL 2011', @b DATETIME = '20 AUG 2011' 
SELECT [dbo].[MIN](@a, @b) 

DECLARE @c INT = 12, @d INT = 32 
SELECT [dbo].[MIN](@c, @d) 
8

dựa trên hàm vô hướng (từ Tom Hunter):

SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate 
FROM TableName 
0

Chỉ cần cho phép nói ble nơi ngày của bạn được gọi là sells và nó có hai trường ngày Date1Date2 mà từ đó bạn muốn tối thiểu.

SELECT ( 
    SELECT MIN([x]) 
    FROM (VALUES(Date1),(Date2)) x([x]) 
) as minimum 
FROM sells 
Các vấn đề liên quan