2016-03-22 25 views
6

Tôi biết có một số thảo luận không áp dụng/bỏ qua ở đây nhưng tôi không thể tìm thấy bất kỳ cuộc thảo luận nào đề cập đến vấn đề của tôi. Những gì tôi có cho đến nay là như sau:TSQL Có thể tháo nhiều cột bằng các hàng có tên?

SELECT Perc, Salary 
FROM (
    SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median 
    FROM vCalculatedView 
    WHERE JobID = '1' 
    GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median] 
) a 
UNPIVOT (
    Salary FOR Perc IN (Perc10, Perc25, Median) 
) AS calc1 

Bây giờ, điều tôi muốn là thêm một số cột khác, ví dụ: một tên được đặt tên là Bonus mà tôi cũng muốn đưa vào Perc10, Perc25 và Median Rows. Thay vào đó, tôi cũng đã thực hiện một truy vấn với cross áp dụng, nhưng ở đây, có vẻ như bạn không thể "buộc" sắp xếp các hàng như bạn có thể với unpivot. Nói cách khác, tôi không thể có một loại tùy chỉnh, nhưng chỉ là một loại theo một số trong bảng, nếu tôi đúng? Ít nhất, ở đây tôi nhận được kết quả như tôi muốn có, nhưng các hàng nằm sai trật tự và tôi không có các tên hàng như Perc10 vv mà sẽ được tốt đẹp.

SELECT crossapplied.Salary, 
     crossapplied.Bonus 
FROM vCalculatedView v 
CROSS APPLY (
    VALUES 
      (Salary_10, Bonus_10) 
     , (Salary_25, Bonus_25) 
     , (Salary_Median, Bonus_Median) 
) crossapplied (Salary, Bonus) 
WHERE JobID = '1' 
GROUP BY crossapplied.Salary, 
     crossapplied.Bonus 

Perc là viết tắt của phần trăm tại đây.

Output được thiết kế để có một cái gì đó như thế này:

+--------------+---------+-------+ 
| Calculation | Salary | Bonus | 
+--------------+---------+-------+ 
| Perc10  |  25 |  5 | 
| Perc25  |  35 | 10 | 
| Median  |  27 |  8 | 
+--------------+---------+-------+ 

Tôi có bỏ lỡ một cái gì đó hoặc đã làm tôi điều gì sai? Tôi đang sử dụng MSSQL 2014, đầu ra sẽ đi vào SSRS. Cảm ơn rất nhiều cho bất kỳ gợi ý trước!

Chỉnh sửa để làm rõ: Các UNPIVOT-Phương pháp cho đầu ra sau đây:

+--------------+---------+ 
    | Calculation | Salary | 
    +--------------+---------+ 
    | Perc10  |  25 | 
    | Perc25  |  35 | 
    | Median  |  27 | 
    +--------------+---------+ 

nên nó thiếu cột "Bonus" ở đây.

Hội Chữ thập-Áp-Phương pháp cho đầu ra sau đây:

+---------+-------+ 
| Salary | Bonus | 
+---------+-------+ 
|  35 | 10 | 
|  25 |  5 | 
|  27 |  8 | 
+---------+-------+ 

Vì vậy, nếu bạn so sánh nó với sản lượng dự định, bạn sẽ nhận thấy rằng cột "Tính toán" là mất tích và phân loại hàng là sai (lưu ý rằng dòng 25 | 5 nằm trong hàng thứ hai thay vì dòng đầu tiên).

Chỉnh sửa 2: Định nghĩa của xem và dữ liệu mẫu: Chế độ xem về cơ bản chỉ thêm các cột được tính của bảng. Trong bảng, tôi có các Cột như Mức lương và Tiền thưởng cho mỗi JobID. The View sau đó chỉ cần tính toán percentiles như thế này:

Select 
    Percentile_Cont(0.1) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_10, 

    Percentile_Cont(0.25) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_25 
from Tabelle 

Vì vậy, đầu ra là như sau:

+----+-------+---------+-----------+-----------+ 
| ID | JobID | Salary | Salary_10 | Salary_25 | 
+----+-------+---------+-----------+-----------+ 
| 1 |  1 |  100 |  60 |  70 | 
| 2 |  1 |  100 |  60 |  70 | 
| 3 |  2 |  150 |  88 |  130 | 
| 4 |  3 |  70 |  40 |  55 | 
+----+-------+---------+-----------+-----------+ 

Cuối cùng, quan điểm sẽ được tham số trong một thủ tục lưu trữ.

+1

của bạn 'vCalculatedView' dường như làm các tính toán trước ... 'nhóm by' của bạn không được làm bất cứ điều gì ... Vui lòng hiển thị kết quả bạn nhận được với bảng sao kê của bạn và cung cấp một số dữ liệu mẫu và đầu ra dự kiến. – Shnugo

+0

Nhóm trong mã Cross Apply áp dụng điều gì đó: Nếu tôi không đưa nó vào, Perc10, Perc25, Median sẽ lặp đi lặp lại. Đó là vì ID công việc không phải là ID của nhân viên và như vậy, ID công việc có thể chứa nhiều hơn một nhân viên. – ksauter

+0

OK. Tôi hiểu ý bạn là gì. Có thể, rằng một 'CTE' với một' CHỌN DISTINCT' là những gì bạn cần. 'GROUP BY' bạn muốn sử dụng cho các tập hợp như' MAX() 'hoặc' SUM() 'Vui lòng cung cấp kết quả truy vấn hiện tại của bạn và cách dữ liệu của bạn sẽ được hiển thị. – Shnugo

Trả lời

1

Đây có phải là cách tiếp cận của bạn không?

Sau khi chỉnh sửa của bạn, tôi hiểu rằng giải pháp của bạn với CROSS APPLY sẽ quay lại với đúng dữ liệu, nhưng không đúng với đầu ra. Bạn có thể thêm giá trị không đổi để VALUES của bạn và thực hiện phân loại trong một wrapper SELECT:

SELECT wrapped.Calculation, 
     wrapped.Salary, 
     wrapped.Bonus 
FROM 
(
    SELECT crossapplied.* 
    FROM vCalculatedView v 
    CROSS APPLY (
     VALUES 
       (1,'Perc10',Salary_10, Bonus_10) 
      , (2,'Perc25',Salary_25, Bonus_25) 
      , (3,'Median',Salary_Median, Bonus_Median) 
    ) crossapplied (SortOrder,Calculation,Salary, Bonus) 
    WHERE JobID = '1' 
    GROUP BY crossapplied.SortOrder, 
      crossapplied.Calculation, 
      crossapplied.Salary, 
      crossapplied.Bonus 
) AS wrapped 
ORDER BY wrapped.SortOrder 
+0

Cảm ơn bạn! Tôi đã đánh dấu giải pháp của bạn là chính xác. Tuy nhiên, đối với những độc giả khác, bạn cần phải đặt tất cả các cột (SortOrder, Calculation, Salary, Bonus) vào GROUP BY Clause, không chỉ là Tiền lương và Tiền thưởng. Đêm qua, tôi đã viết truy vấn với Phương pháp UNPIVOT với CTE và LEFT JOIN, nhưng đó là khóa học dài hơn nhiều. Để các độc giả đến, tôi sẽ đặt câu trả lời này như một câu trả lời khác, nhưng đó không phải là để đánh bại giải pháp của bạn. Các giải pháp của bạn cho thấy một lần nữa rằng hầu hết thời gian, CROSS ÁP DỤNG nhịp đập Unpivot giống như nhiều blogger hiển thị trong so sánh. – ksauter

+1

Thx để chấp nhận! Tôi đã chỉnh sửa câu trả lời của tôi để phản ánh gợi ý của bạn về 'GROUP BY COLUMNS'. Nếu bạn thích câu trả lời của tôi nó sẽ là loại để bỏ phiếu bổ sung nó lên. Bỏ phiếu và chấp nhận là hai bước riêng biệt ... Thx lần nữa! – Shnugo

Các vấn đề liên quan