2012-02-16 36 views
7

Nếu tôi có bảng sauphân tách Bảng Hơn 2 Cột trong T-SQL

Hour Clicks Conversions 
12:00 2 0 
1:00 3 2 
2:00 1 1 

Làm thế nào để viết một Statment SELECT dissaggrates nó trên cả hai cột, vì vậy tôi có được:

12:00 1 0 
12:00 1 0 
1:00 1 0 
1:00 1 1 
1:00 1 1 
2:00 1 1 

Nếu tôi không thể làm điều đó với một SELECT, làm thế nào để tôi viết một proc được lưu trữ mà nó với một vòng lặp?

Cảm ơn!

+0

Tạo một CLR sp –

+0

1 vấn đề thú vị. Không phải là một cái mới, nhưng nó đã cho tôi một vài phút để nghĩ về giải pháp, vì vậy bạn nhận được một cuộc bỏ phiếu từ tôi. :-) –

+0

Tôi không thấy điểm của cột thứ hai dường như luôn trả về 1 –

Trả lời

5

Giả định này sẽ chỉ bao giờ là một hàng cho bất kỳ giá trị đã cho nào là [Hour]. Nếu có thể có bản sao, tôi sẽ tổng hợp những người đầu tiên (tôi giả sử nguồn đã là một tập hợp của một số loại).

DECLARE @x TABLE ([Hour] CHAR(5), Clicks INT, Conversions INT); 

INSERT @x SELECT '12:00',2,0 
UNION ALL SELECT '13:00',3,2 
UNION ALL SELECT '14:00',1,1; 

;WITH x AS 
(
    SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_columns AS s1 
    -- CROSS JOIN (SELECT 1 UNION ALL SELECT 2) AS s2 -- to double the rows if you need more 
), 
y AS 
(
    SELECT [Hour], Conversions, Clicks, 
    m = MAX(CASE WHEN Conversions > Clicks THEN Conversions ELSE Clicks END) 
    FROM @x GROUP BY [Hour], Conversions, Clicks 
) 
SELECT y.[Hour], 
    Clicks = CASE WHEN Clicks < x.n THEN 0 ELSE 1 END, 
    Conversions = CASE WHEN Conversions < x.n THEN 0 ELSE 1 END 
FROM x INNER JOIN y ON x.n <= y.m 
ORDER BY CONVERT(TIME, y.[Hour]), Clicks, Conversions; 
2

Đây không phải là cách tiếp cận hiệu quả nhất, nhưng có thể đủ để bạn bắt đầu.

DECLARE @T TABLE (
    Hour   TIME 
    , Clicks  INT 
    , Conversions INT 
); 

INSERT @T VALUES ('12:00', 2, 0); 
INSERT @T VALUES ('1:00', 3, 2); 
INSERT @T VALUES ('2:00', 1, 1); 


DECLARE @Stage TABLE (
    Hour   TIME 
    , Clicks  INT 
    , Conversions INT 
); 

DECLARE @MaxClicks INT; 

SELECT @MaxClicks = MAX(Clicks) FROM @T; 

DECLARE @ClickCount INT; SET @ClickCount = 1; 

WHILE @ClickCount <= @MaxClicks 
BEGIN 
    INSERT @Stage (Hour, Clicks, Conversions) 
    SELECT Hour, 1, CASE WHEN Conversions >= @ClickCount THEN 1 ELSE 0 END 
    FROM @T WHERE Clicks >= @ClickCount; 

    SET @ClickCount = @ClickCount + 1; 
END; 

SELECT * FROM @Stage ORDER BY Hour; 
+0

Mặc dù không (và tôi chỉ biết điều này vì tôi quen thuộc với loại mô hình dữ liệu), điều gì sẽ xảy ra nếu chuyển đổi cao hơn nhấp chuột cho một giờ nhất định? ví dụ. có thể ai đó đã nhấp vào lúc 3:59 và mua lúc 4:01. –

+0

Điểm lấy ... Tôi sẽ tưởng tượng rằng cách tiếp cận bảng kiểm đếm của bạn sẽ hiệu quả hơn. – JSR

+0

Tôi nghĩ vậy. Nhưng xin vui lòng gọi nó là một bảng số. Nó không phải là kiểm đếm bất cứ điều gì. :-) –

0
DECLARE @x TABLE ([Hour] TIME, Clicks INT, Conversions INT); 
INSERT @x VALUES ('12:00',2,0),('13:00',3,2), ('14:00',1,1); 

;WITH a as 
(
SELECT [hour], 1 [unnessasary column], clicks, CASE WHEN clicks <= Conversions THEN 1 ELSE 0 END click, Conversions 
FROM @x 
UNION ALL 
SELECT [hour], 1, clicks-1,CASE WHEN clicks-1 <= Conversions THEN 1 ELSE 0 END, Conversions 
FROM a 
WHERE clicks > 1 
) 
SELECT [hour],[unnessasary column], click 
FROM a 
ORDER BY 1 
OPTION (maxrecursion 0) 
Các vấn đề liên quan