【问题标题】:PIVOT issue in SQLSQL 中的 PIVOT 问题
【发布时间】:2020-01-31 20:56:51
【问题描述】:

我无法解决我在 SQL 中的数据透视函数的问题。我想保留 uid 列,但我的结果中每个 uid 只有一行 + sc_2015、sc_2016、sc_2017 等的列。(在原始表中,每年每个月有一个 uid 行 + 分数列。)

SELECT * FROM 
(
SELECT DISTINCT
        t1.uid,
        t2.score_year AS yr,
        --averaging scores across 12-months per year per uid:
        CAST(AVG(t2.score) OVER (PARTITION BY t1.uid,t2.score_year) AS DECIMAL(4,3)) AS avg_annual_score
FROM
    table1 t1
    INNER JOIN table2 t2
    ON t1.uid
    =
    t2.uid
WHERE t2.score_year IN (
  '2015',
  '2016',
  '2017',
  '2018',
  '2019')
)
PIVOT (
MAX(avg_annual_score) sc FOR yr IN (
  '2015',
  '2016',
  '2017',
  '2018',
  '2019')
);

【问题讨论】:

  • 您使用的是哪个 dbms?
  • dbms 是 SQL Server。

标签: sql sql-server pivot in-clause


【解决方案1】:

我将建议放弃 PIVOT 运算符,而只在此处使用老式的枢轴查询:

SELECT
    t1.uid,
    AVG(CASE WHEN t2.score_year = 2015 THEN t2.score END) AS avg_score_2015,
    AVG(CASE WHEN t2.score_year = 2016 THEN t2.score END) AS avg_score_2016
    AVG(CASE WHEN t2.score_year = 2017 THEN t2.score END) AS avg_score_2017,
    AVG(CASE WHEN t2.score_year = 2018 THEN t2.score END) AS avg_score_2018
FROM table1 t1
LEFT JOIN table2 t2
    ON t1.uid = t2.uid
GROUP BY
    t1.uid;

我建议不使用PIVOT 的原因是,在许多情况下,上述版本实际上性能更好。而且恕我直言,代码更易于阅读和维护。

编辑:

一个可能写成PIVOT 的版本看起来像这样:

SELECT uid, [2015], [2016], [2017], [2018]
FROM
(
    SELECT t1.uid, t2.score, t2.score_year
    FROM table1 t1
    LEFT JOIN table2 t2
        ON t1.uid = t2.uid
    WHERE t2.score_year BETWEEN 2015 AND 2018
) AS source
PIVOT
(
    AVG(score)
    FOR score_year IN ([2015], [2016], [2017], [2018])
) AS pivotal;

【讨论】:

  • 非常感谢!这太棒了。 :) 您是否碰巧知道我的 PIVOT 在我的查询中存在什么问题? (它会困扰我,直到我弄清楚哈哈。)
  • @es_analytics 遗憾的是,我没有……主要是因为我倾向于避免使用PIVOT,而且 SO 上的大多数人也不经常使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多