将行值转换为列值--SQL PIVOT
SQL从表中返回以下结果:CowTracking将行值转换为列值--SQL PIVOT,sql,pivot,Sql,Pivot,SQL从表中返回以下结果:CowTracking ID cow_id barn_id -- ------ ------- 19 5 3 20 5 2 21 5 9 22 5 1 我试图通过SQL中的PIVOT获得以下结果 cow_id barn1 barn2 barn3 barn4 ------ ----- ----- -----
ID cow_id barn_id
-- ------ -------
19 5 3
20 5 2
21 5 9
22 5 1
我试图通过SQL中的PIVOT获得以下结果
cow_id barn1 barn2 barn3 barn4
------ ----- ----- ----- -----
5 3 2 9 1
这是我目前掌握的代码
SELECT *
FROM
(
SELECT TOP 4 *
FROM CowTracking
WHERE cow_id = 5
) AS DataTable
PIVOT
(
MIN(barn_id) **IDK what function to use and which column to use it on**
FOR ID ??<---**NOT SURE**
IN
(
[barn1], [barn2], [barn3], [barn4]
)
) AS PivotTable
ERRORS: Error converting data type nvarchar to int
The incorrect value "barn1" is supplied in the PIVOT operator
注意:barn_id是一个varchar。无法更改数据类型
我不是在尝试加法/乘法/加法或其他方法。我只是尝试将行移动到列
我该怎么做呢?
这是正确的思维过程吗
我甚至需要使用PIVOT吗?由于您的表中没有barn1..4,您必须以某种方式将ID替换为相应的Barn
使用PIVOT的一个解决方案可能是这样的
SELECT cow_id
, [19] as [barn1]
, [20] as [barn2]
, [21] as [barn3]
, [22] as [barn4]
FROM (
SELECT *
FROM DataTable
PIVOT ( MIN(barn_id)
FOR ID IN ([19], [20], [21], [22])
) AS PivotTable
) q
使用CASE和groupby的另一个解决方案可以是
但在本质上,这一切归结为对谷仓的ID进行硬编码
编辑
如果您总是返回固定数量的记录,并且使用SQL Server,那么通过
向每个结果中添加行号
以这个预先已知的数字为轴心
SQL语句
测试脚本
你的第一个建议恰到好处。一开始我很担心,因为身份证总是会变。但后来我声明了一个新列,并将其设置为始终为1-4。然后我就可以完成了。谢谢,伙计,非常感谢。我花了一点时间才明白过来concept@sQuijeW-不客气。如果这回答了您的问题,您可以这样标记它
SELECT cow_id
, [barn1] = SUM(CASE WHEN ID = 19 THEN barn_id END)
, [barn2] = SUM(CASE WHEN ID = 20 THEN barn_id END)
, [barn3] = SUM(CASE WHEN ID = 21 THEN barn_id END)
, [barn4] = SUM(CASE WHEN ID = 22 THEN barn_id END)
FROM DataTable
GROUP BY
cow_id
SELECT cow_id
, [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
, [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
, [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
, [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
FROM (
SELECT cow_id
, rn = ROW_NUMBER() OVER (ORDER BY ID)
, barn_id
FROM DataTable
) q
GROUP BY
cow_id
;WITH DataTable (ID, cow_id, barn_id) AS (
SELECT * FROM (VALUES
(19, 5, 3)
, (20, 5, 2)
, (21, 5, 9)
, (22, 5, 1)
) AS q (a, b, c)
)
SELECT cow_id
, [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
, [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
, [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
, [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
FROM (
SELECT cow_id
, rn = ROW_NUMBER() OVER (ORDER BY ID)
, barn_id
FROM DataTable
) q
GROUP BY
cow_id