【问题标题】:Horizontal Count SQL水平计数 SQL
【发布时间】:2014-09-16 14:57:30
【问题描述】:

如果这是一个重复的问题,我很抱歉,但我找不到答案。

我正在尝试获取水平数据,并计算特定数字出现的次数。

示例表

+-------+-------+-------+-------+
| Empid | KPI_A | KPI_B | KPI_C |
+-------+-------+-------+-------+
|   232 |     1 |     3 |     3 |
|   112 |     2 |     3 |     2 |
|   143 |     3 |     1 |     1 |
+-------+-------+-------+-------+

我需要查看以下内容:

+-------+--------------+--------------+--------------+
| EmpID | (1's Scored) | (2's Scored) | (3's Scored) |
+-------+--------------+--------------+--------------+
|   232 |            1 |            0 |            2 |
|   112 |            0 |            2 |            1 |
|   143 |            2 |            0 |            1 |
+-------+--------------+--------------+--------------+          

我希望这是有道理的。任何帮助将不胜感激。

【问题讨论】:

  • 是否确定总是恰好是三个 KPI_x 列?

标签: sql sql-server-2005 pivot unpivot


【解决方案1】:

由于您要跨多个列计算数据,因此可能更容易先对您的 KPI 列进行反透视,然后再计算分数。

您可以使用 UNPIVOT 函数或 CROSS APPLY 将 KPI 列转换为多行。语法类似于:

select EmpId, KPI, Val
from yourtable
cross apply
(
  select 'A', KPI_A union all
  select 'B', KPI_B union all
  select 'C', KPI_C
) c (KPI, Val)

SQL Fiddle with Demo。这会将您的多列分成多行,这样更容易使用:

| EMPID | KPI | VAL |
|-------|-----|-----|
|   232 |   A |   1 |
|   232 |   B |   3 |
|   232 |   C |   3 |
|   112 |   A |   2 |

现在您可以使用带有 CASE 表达式的聚合函数轻松计算 123 的数量:

select EmpId,
  sum(case when val = 1 then 1 else 0 end) Score_1,
  sum(case when val = 2 then 1 else 0 end) Score_2,
  sum(case when val = 3 then 1 else 0 end) Score_3
from
(
  select EmpId, KPI, Val
  from yourtable
  cross apply
  (
    select 'A', KPI_A union all
    select 'B', KPI_B union all
    select 'C', KPI_C
  ) c (KPI, Val)
) d
group by EmpId;

SQL Fiddle with Demo。这给出了最终结果:

| EMPID | SCORE_1 | SCORE_2 | SCORE_3 |
|-------|---------|---------|---------|
|   112 |       0 |       2 |       1 |
|   143 |       2 |       0 |       1 |
|   232 |       1 |       0 |       2 |

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2017-12-25
    相关资源
    最近更新 更多