我必须从SQL Server旋转给定的表,但是正常的枢轴是行不通的(就我所尝试的而言)。因此,有人知道如何将表格旋转为所需的格式吗?
只是使问题更加复杂,给定标签的列表可能会有所不同,并且有可能在任何给定时间输入新的标签名称。
ID | Label | Numerator | Denominator | Ratio
---+-----------------+-------------+---------------+--------
1 | LabelNameOne | 41 | 10 | 4,1
1 | LabelNameTwo | 0 | 0 | 0
1 | LabelNameThree | 21 | 10 | 2,1
1 | LabelNameFour | 15 | 10 | 1,5
2 | LabelNameOne | 19 | 19 | 1
2 | LabelNameTwo | 0 | 0 | 0
2 | LabelNameThree | 15 | 16 | 0,9375
2 | LabelNameFive | 19 | 19 | 1
2 | LabelNameSix | 17 | 17 | 1
3 | LabelNameOne | 12 | 12 | 1
3 | LabelNameTwo | 0 | 0 | 0
3 | LabelNameThree | 11 | 12 | 0,9167
3 | LabelNameFour | 12 | 12 | 1
3 | LabelNameSix | 0 | 1 | 0
ID | ValueType | LabelNameOne | LabelNameTwo | LabelNameThree | LabelNameFour | LabelNameFive | LabelNameSix
---+-------------+--------------+--------------+----------------+---------------+---------------+--------------
1 | Numerator | 41 | 0 | 21 | 15 | |
1 | Denominator | 10 | 0 | 10 | 10 | |
1 | Ratio | 4,1 | 0 | 2,1 | 1,5 | |
2 | Numerator | 19 | 0 | 15 | | 19 | 17
2 | Denominator | 19 | 0 | 16 | | 19 | 17
2 | Ratio | 1 | 0 | 0,9375 | | 1 | 1
3 | Numerator | 12 | 0 | 11 | 12 | | 0
3 | Denominator | 12 | 0 | 12 | 12 | | 1
3 | Ratio | 1 | 0 | 0,9167 | 1 | | 0
这应该可以解决您的问题。这实际上是UNPIVOT和PIVOT。请注意,您必须使数据一致,因为UNPIVOT将所有数据放在同一列中。
请注意,我必须在内部动态SQL中重新创建/重新填充表变量-通常,在处理永久表时,这不是必需的。
SET NOCOUNT ON ;
DECLARE @pivot_cols AS varchar(max) ;
DECLARE @src AS TABLE
(
ID int NOT NULL
,Label varchar(14) NOT NULL
,Numerator int NOT NULL
,Denominator int NOT NULL
,Ratio decimal(5, 4) NOT NULL
) ;
DECLARE @label_order AS TABLE
(
Label varchar(14) NOT NULL
,Sort int NOT NULL
)
INSERT INTO @src
VALUES (1, 'LabelNameOne', 41, 10, 4.1) ;
INSERT INTO @src
VALUES (1, 'LabelNameTwo', 0, 0, 0) ;
INSERT INTO @src
VALUES (1, 'LabelNameThree', 21, 10, 2.1) ;
INSERT INTO @src
VALUES (1, 'LabelNameFour', 15, 10, 1.5) ;
INSERT INTO @src
VALUES (2, 'LabelNameOne', 19, 19, 1) ;
INSERT INTO @src
VALUES (2, 'LabelNameTwo', 0, 0, 0) ;
INSERT INTO @src
VALUES (2, 'LabelNameThree', 15, 16, 0.9375) ;
INSERT INTO @src
VALUES (2, 'LabelNameFive', 19, 19, 1) ;
INSERT INTO @src
VALUES (2, 'LabelNameSix', 17, 17, 1) ;
INSERT INTO @src
VALUES (3, 'LabelNameOne', 12, 12, 1) ;
INSERT INTO @src
VALUES (3, 'LabelNameTwo', 0, 0, 0) ;
INSERT INTO @src
VALUES (3, 'LabelNameThree', 11, 12, 0.9167) ;
INSERT INTO @src
VALUES (3, 'LabelNameFour', 12, 12, 1) ;
INSERT INTO @src
VALUES (3, 'LabelNameSix', 0, 1, 0) ;
INSERT INTO @label_order
VALUES ('LabelNameOne', 1) ;
INSERT INTO @label_order
VALUES ('LabelNameTwo', 2) ;
INSERT INTO @label_order
VALUES ('LabelNameThree', 3) ;
INSERT INTO @label_order
VALUES ('LabelNameFour', 4) ;
INSERT INTO @label_order
VALUES ('LabelNameFive', 5) ;
INSERT INTO @label_order
VALUES ('LabelNameSix', 6) ;
WITH Labels
AS (
SELECT DISTINCT
src.Label
,ISNULL(label_order.Sort, 0) AS Sort
FROM @src AS src
LEFT JOIN @label_order AS label_order
ON src.label = label_order.label
)
SELECT @pivot_cols = COALESCE(@pivot_cols + ',', '') + QUOTENAME(Label, '[')
FROM Labels
ORDER BY Sort
,Label ;
DECLARE @template AS varchar(max) ;
SET @template = '
DECLARE @src AS TABLE
(
ID int NOT NULL
,Label varchar(14) NOT NULL
,Numerator int NOT NULL
,Denominator int NOT NULL
,Ratio decimal(5, 4) NOT NULL
) ;
INSERT INTO @src
VALUES (1, ''LabelNameOne'', 41, 10, 4.1) ;
INSERT INTO @src
VALUES (1, ''LabelNameTwo'', 0, 0, 0) ;
INSERT INTO @src
VALUES (1, ''LabelNameThree'', 21, 10, 2.1) ;
INSERT INTO @src
VALUES (1, ''LabelNameFour'', 15, 10, 1.5) ;
INSERT INTO @src
VALUES (2, ''LabelNameOne'', 19, 19, 1) ;
INSERT INTO @src
VALUES (2, ''LabelNameTwo'', 0, 0, 0) ;
INSERT INTO @src
VALUES (2, ''LabelNameThree'', 15, 16, 0.9375) ;
INSERT INTO @src
VALUES (2, ''LabelNameFive'', 19, 19, 1) ;
INSERT INTO @src
VALUES (2, ''LabelNameSix'', 17, 17, 1) ;
INSERT INTO @src
VALUES (3, ''LabelNameOne'', 12, 12, 1) ;
INSERT INTO @src
VALUES (3, ''LabelNameTwo'', 0, 0, 0) ;
INSERT INTO @src
VALUES (3, ''LabelNameThree'', 11, 12, 0.9167) ;
INSERT INTO @src
VALUES (3, ''LabelNameFour'', 12, 12, 1) ;
INSERT INTO @src
VALUES (3, ''LabelNameSix'', 0, 1, 0) ;
WITH src_conformed
AS (
SELECT ID
,Label
,CAST (Numerator AS decimal(10, 4)) AS Numerator
,CAST (Denominator AS decimal(10, 4)) AS Denominator
,CAST (Ratio AS decimal(10, 4)) AS Ratio
FROM @src
),
UNPIVOTED
AS (
SELECT *
FROM src_conformed UNPIVOT ( Val FOR Col IN (Numerator, Denominator, Ratio) ) AS unpvt
)
SELECT *
FROM UNPIVOTED PIVOT ( SUM(Val) FOR Label IN ({@pivot_cols}) ) AS pvt
ORDER BY ID
,Col ;' ;
SET @template = REPLACE(@template, '{@pivot_cols}', @pivot_cols) ;
EXEC (@template) ;
我试图创建一个简单的表,但它给了我一个错误: 剧本: 我想不出这个问题,有人能帮忙吗?
问题内容: 是否可以使用T-SQL执行存储在表中的SQL语句? 表中存储的语句是临时语句,可以是 SELECT TOP 100 * FROM ATable 到更复杂的语句: 我想执行从T-SQL声明的 @Query 变量。这可能吗?(我正在运行MSSQL 2005环境) 问题答案: 您可以使用 运行您的T-SQL 这是SQL Server 2005的MS docn的链接 http://msdn.m
如何将类author中的author\u firstName和author\u lastName与类目绑定?我使用h2数据库,作者id和图书id是主键,我使用postman
问题内容: 如何检测Java中给定的SQL数据库中是否存在某个表? 问题答案: 您可以使用DatabaseMetaData.getTables()获取有关现有表的信息。 该方法透明地工作,并且独立于数据库引擎。我认为它查询后台的信息模式表。 编辑: 这是一个显示所有现有表名的示例。
问题内容: 我在一个表中有一个XML列,如下所示: 我想像这样更新此字段: 我想通过SQL Server中的一个函数来做。 谢谢! 问题答案: 正如Mikael所述,您需要描述更新背后的逻辑。但是对于上面的预期输出,以下应该起作用: