2011-12-22 58 views
0

作为一个例子,可以说我的数据集认为:SQL查询语法:破出列的值

EMPLOYEE_ID 
EMPLOYEE_NAME 
EMPLOYEE_ACCT_ID 
EMPLOYEE_ACCT_TYPE 
EMPLOYEE_ACCT_BALANCE 

我想通过以下方式来呈现数据:

EMPLOYEE | CHECKING | SAVINGS | INVESSTMENT | XMAS | 
_______________________________________________________________________ 

Mary  |  100.00 |  700.00 |  3,000.00 | 175.00 
Jim  |  850.00 |  600.00 |  1,500.00 |  0.00 

TOTAL  |  950.00 | 1,300.00 |  4,500.00 | 175.00 

我在哪里被困住的是如何将EMPLOYEE_ACCT_TYPE分成列,每个帐户类型值列出了它的余额。提前致谢。

+0

重新格式化的表格,有一个人表,并与ACCT型和人ID为的帐户表 – 2011-12-22 14:54:42

+0

复合主键@Susan您需要提供更多信息一个ACCT表。你有几个记录每个员工?每个帐户都有不同的帐户类型? – 2011-12-22 14:55:22

+2

您使用的是什么RDBMS?,您是否有固定数量的'EMPLOYEE_ACCT_TYPE',或者您希望您的查询是动态的? – Lamak 2011-12-22 14:57:19

回答

1

你要做的是一个叫做枢轴。某些系统(例如SQL Server)在SQL中具有本机支持,但前提是您事先知道列数(即您必须将帐户类型硬编码到SQL中)。其他系统不支持本地转换(例如MySQL),因此您需要编写一个存储过程或一些动态SQL来执行此操作。

既然你不提您所使用的数据库管理系统,这是我们所特定的,因为我可以得到的。

+1

您可以通过使用一些动态代码来避免对硬编码列名的需求http://stackoverflow.com/questions/2922797/t-sql-pivot-possibility-of-creating-table-columns-from-row-值 – billinkc 2011-12-22 15:26:31

+0

谢谢,我会看看 - 听起来真的很有用。 – Susan 2011-12-22 16:06:34

+0

这是gr8,真的很有趣...ty – Susan 2011-12-23 15:59:09

0

这听起来像你对我需要做一些认真的正常化,第一。打破employee_account数据输出到它自己的表:

表:employee_account_data

EMPLOYEE_ACCT_ID int 
EMPLOYEE_ACCT_TYPE varchar(15) 
EMPLOYEE_ACCT_BALANCE decimal 

您还需要一个桥接表,因为许多员工可以有多个账户(多对多):

表:employee_account_lookup

EMPLOYEE_ID int 
EMPLOYEE_ACCT_ID int 

这样,您将不会重复每个帐户类型的employee_name(因为我怀疑您现在是)。如果您确实想要正常化,您还可以创建一个表来容纳不同的员工账户类型。这样,您就不必担心有人在输入数据时误解了“检查”或“储蓄”。

+0

请注意,OP表示数据集,而不是表 - 数据集可能是查询规范化表的结果。 – 2011-12-22 15:09:58

+0

好点,我确实认为那是一张桌子。 – Aaron 2011-12-22 15:17:20

+0

是的,这是正确的。这是查询规范化表格的结果。 – Susan 2011-12-22 16:01:01