假设我在SQL Server中有一个表,该表有10列,标题为Col-1, Col-2, ... Col-10
。现在,我想编写一个SQL查询,该查询将首先分别计算所有10列的Column-sums -由此将生成长度为10的行,然后计算值的中位数生成的行中的。
要添加更多细节,可以说我有下表。我需要SQL来计算Col-sum值的中位数,如下图所示。
Col - 1 Col - 2 Col - 3 Col - 4 Col - 5 Col - 6 Col - 7 Col - 8 Col - 9 Col - 10
0.4763 0.9746 0.5082 0.8707 0.3608 0.6984 0.9326 0.9983 0.1441 0.6882
0.9396 0.9358 0.6548 0.8046 0.3274 0.3072 0.1275 0.8273 0.9785 0.9618
0.6656 0.7000 0.1664 0.0341 0.9804 0.4973 0.2023 0.4619 0.9759 0.0456
0.9707 0.3495 0.8282 0.6389 0.8845 0.8833 0.8424 0.6087 0.4165 0.6986
0.5992 0.8121 0.0324 0.9134 0.9613 0.6163 0.1110 0.8911 0.7429 0.4397
0.1069 0.6702 0.6478 0.9055 0.3594 0.0060 0.0556 0.4216 0.0578 0.2796
Col-sum 3.7583 4.4421 2.8378 4.1672 3.8737 3.0085 2.2714 4.2088 3.3157 3.1135
**Median 3.537024951**
任何在SQL中如何实现这样的指针将受到高度赞赏。谢谢,
答案 0 :(得分:0)
让我们从临时表中的示例数据开始:
CREATE TABLE #temp
(
Col1 DECIMAL(18, 4)
,Col2 DECIMAL(18, 4)
,Col3 DECIMAL(18, 4)
,Col4 DECIMAL(18, 4)
,Col5 DECIMAL(18, 4)
,Col6 DECIMAL(18, 4)
,Col7 DECIMAL(18, 4)
,Col8 DECIMAL(18, 4)
,Col9 DECIMAL(18, 4)
,Col10 DECIMAL(18, 4)
)
INSERT INTO #temp
(
Col1
,Col2
,Col3
,Col4
,Col5
,Col6
,Col7
,Col8
,Col9
,Col10
)
VALUES
(0.4763, 0.9746, 0.5082, 0.8707, 0.3608, 0.6984, 0.9326, 0.9983, 0.1441, 0.6882)
,(0.9396, 0.9358, 0.6548, 0.8046, 0.3274, 0.3072, 0.1275, 0.8273, 0.9785, 0.9618)
,(0.6656, 0.7000, 0.1664, 0.0341, 0.9804, 0.4973, 0.2023, 0.4619, 0.9759, 0.0456)
,(0.9707, 0.3495, 0.8282, 0.6389, 0.8845, 0.8833, 0.8424, 0.6087, 0.4165, 0.6986)
,(0.5992, 0.8121, 0.0324, 0.9134, 0.9613, 0.6163, 0.1110, 0.8911, 0.7429, 0.4397)
,(0.1069, 0.6702, 0.6478, 0.9055, 0.3594, 0.0060, 0.0556, 0.4216, 0.0578, 0.2796)
接下来,我们将使用几个CTE将数据转换为计算中位数所需的表格。顺便说一句,我使用的是答案中发布的中位数算法:Function to Calculate Median in SQL Server
第一个CTE获取所有列的SUM。第二个CTE将列“透视”为行。然后,主查询会找到中位数。
;WITH Sums AS
(
SELECT Col1 = SUM(col1)
,Col2 = SUM(col2)
,Col3 = SUM(col3)
,Col4 = SUM(col4)
,Col5 = SUM(col5)
,Col6 = SUM(col6)
,Col7 = SUM(col7)
,Col8 = SUM(col8)
,Col9 = SUM(col9)
,Col10 = SUM(col10)
FROM #temp
)
,SumVals AS
(
SELECT SumVal = Col1
FROM Sums
UNION ALL
SELECT SumVal = Col2
FROM Sums
UNION ALL
SELECT SumVal = Col3
FROM Sums
UNION ALL
SELECT SumVal = Col4
FROM Sums
UNION ALL
SELECT SumVal = Col5
FROM Sums
UNION ALL
SELECT SumVal = Col6
FROM Sums
UNION ALL
SELECT SumVal = Col7
FROM Sums
UNION ALL
SELECT SumVal = Col8
FROM Sums
UNION ALL
SELECT SumVal = Col9
FROM Sums
UNION ALL
SELECT SumVal = Col10
FROM Sums
)
SELECT
Median = AVG(SumVal)
FROM
(
SELECT
SumVal,
ROW_NUMBER() OVER (ORDER BY SumVal ASC) AS RowAsc,
ROW_NUMBER() OVER (ORDER BY SumVal DESC) AS RowDesc
FROM SumVals sv
) x
WHERE
RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)
DROP TABLE #temp
结果:
Median
3.537000
答案 1 :(得分:0)
也许您需要这个?
DECLARE
@t TABLE (
col1 DECIMAL(18,4)
, col2 DECIMAL(18,4)
, col3 DECIMAL(18,4)
, col4 DECIMAL(18,4)
, col5 DECIMAL(18,4)
, col6 DECIMAL(18,4)
, col7 DECIMAL(18,4)
, col8 DECIMAL(18,4)
, col9 DECIMAL(18,4)
, col10 DECIMAL(18,4)
)
INSERT INTO @t VALUES
(0.4763,0.9746,0.5082,0.8707,0.3608,0.6984,0.9326,0.9983,0.1441,0.6882),
(0.9396,0.9358,0.6548,0.8046,0.3274,0.3072,0.1275,0.8273,0.9785,0.9618),
(0.6656,0.7000,0.1664,0.0341,0.9804,0.4973,0.2023,0.4619,0.9759,0.0456),
(0.9707,0.3495,0.8282,0.6389,0.8845,0.8833,0.8424,0.6087,0.4165,0.6986),
(0.5992,0.8121,0.0324,0.9134,0.9613,0.6163,0.1110,0.8911,0.7429,0.4397),
(0.1069,0.6702,0.6478,0.9055,0.3594,0.0060,0.0556,0.4216,0.0578,0.2796)
SELECT
(col1 + col2 + col3 + col4 + col5 + col6 + col7 + col8 + col9 + col10) / 10 Median
FROM (
SELECT
SUM(col1) col1
, SUM(col2) col2
, SUM(col3) col3
, SUM(col4) col4
, SUM(col5) col5
, SUM(col6) col6
, SUM(col7) col7
, SUM(col8) col8
, SUM(col9) col9
, SUM(col10) col10
FROM @t
) D
答案 2 :(得分:0)
此查询还将执行:
Select sum(sumOfColumns)/2 as medianOfColumns from (select * from (
(
Select ROW_NUMBER() over (ORDER BY sumOfColumns ASC) as rnum, sumOfColumns from
(
Select sum(col1) as sumOfColumns from temp_table group by col1
UNION ALL
Select sum(col2) as sumOfColumns from temp_table group by col2
UNION ALL
Select sum(col3) as sumOfColumns from temp_table group by col3
UNION ALL
Select sum(col4) as sumOfColumns from temp_table group by col4
UNION ALL
Select sum(col5) as sumOfColumns from temp_table group by col5
UNION ALL
Select sum(col6) as sumOfColumns from temp_table group by col6
UNION ALL
Select sum(col7) as sumOfColumns from temp_table group by col7
UNION ALL
Select sum(col8) as sumOfColumns from temp_table group by col8
UNION ALL
Select sum(col9) as sumOfColumns from temp_table group by col9
UNION ALL
Select sum(col10) as sumOfColumns from temp_table group by col10
)
)
)where rnum BETWEEN 5 and 6
);