按非标准化列分组

时间:2016-07-05 23:56:20

标签: sql sql-server sql-server-2000

使用SQL Server 2000 - 我有一个旧的数据库,并且没有规范化。

它有一堆列,如

memId
c1
c2
c3
c4
c5

这些列包含一个数字样本

123
10
20
0
40
0

123
0
20
0
40
5

我想要的是提取按照这个

的memId和列名分组的数据

将出现

memId  col   total
123    c1    10
123    c2    40
123    c4    80
123    c5    5

其中数字是该组的总和

我想我可以每次拉动它们并将它们组合在一起,但是想知道是否有更简单的方法。

2 个答案:

答案 0 :(得分:1)

听起来你想unpivot你的结果。您的数据库的一个选项是union all

select memId, 'c1' as col, sum(c1) from yourtable group by memId, col
union all
select memId, 'c2' as col, sum(c2) from yourtable group by memId, col
union all
select memId, 'c3' as col, sum(c3) from yourtable group by memId, col
union all
select memId, 'c4' as col, sum(c4) from yourtable group by memId, col
union all
select memId, 'c5' as col, sum(c5) from yourtable group by memId, col

答案 1 :(得分:-1)

我似乎误解了你的观点,哎呀。您是将信息迁移到另一个表吗?

  

但首先,关于我使用术语标准化的说明

First Normal Form
 - Eliminate repeating groups in individual tables.
 - Create a separate table for each set of related data.
 - Identify each set of related data with a primary key.
     

显然我对规范化是错误的。 哎哟。好事   我还年轻,是吗? :/

我花了一些时间重新评估这个(一个致命的错误,不是吗?)以及SQL Server 2000的限制。我在redware - SQL SERVER Handbook上找到了一个有用的SQL Server 2000手册汇编。

当谈到表达式时......唯一出现的是subqueriesviews,虽然没有真正的排名功能(谢天谢地,你可以创建Functions)。

虽然可以通过某种草书添加值,但为什么呢?

  • 你仍然要解析表格,至少 N x #Columns是不透明的。没有复杂的枢轴(无论如何都不存在)。
  • SELECT'C1'不是使用任何昂贵的草书,而是简单且易于修改为行。
  • 您希望连接表,因此最简单的方法仍然是UNION ALL
  • 连接后可以运行GROUP BY一次。简单而优雅。

<强> SOLUTION:

SELECT memID
     , Col
     , SUM(C1) AS Count 
FROM (
      SELECT 'C1' AS [Col], memID, C1 FROM  #Test2
      UNION ALL SELECT 'C2' AS [Col], memID, C2 FROM #Test2
      UNION ALL SELECT 'C3' AS [Col], memID, C3 FROM #Test2
      UNION ALL SELECT 'C4' AS [Col], memID, C4 FROM #Test2
      UNION ALL SELECT 'C5' AS [Col], memID, C5 FROM #Test2 ) AS A
GROUP BY memID, Col
ORDER BY memID ASC, Col ASC

来源表:

CREATE TABLE #Test2 (memID INT, C1 INT, C2 INT, C3 INT, C4 INT, C5 INT)
INSERT INTO #Test2 (memId, C1, C2, C3, C4, C5)
VALUES (123, 10, 20, 0, 40, 0)
     , (123, 0, 20, 0, 40, 5)
     , (122, 5, 20, 10, 15, 0)
     , (122, 5, 0, 0, 0, 60)
     , (155, 10, 0, 0, 10, 10)
     , (155, 0, 0, 0, 50, 50)

<强>结果:

memID   Col Count
122     C1  10
122     C2  20
122     C3  10
122     C4  15
122     C5  60
123     C1  10
123     C2  40
123     C3  0
123     C4  80
123     C5  5
155     C1  10
155     C2  0
155     C3  0
155     C4  60
155     C5  60

所以我认为你最初的想法是正确的。 欢呼声。