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
------ ----- ----- ----- -----
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吗?
发布于 2012-02-03 03:30:39
由于您的表中没有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和GROUP BY的解决方案可能是
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但从本质上讲,这一切都归结为将ID硬编码为barn。
编辑
如果您总是返回固定数量的记录,并且使用SQL Server,则可以通过以下方式使其更加健壮
ROW_NUMBER to each result (在此前期已知数字上为每个结果添加一个透视图)
SQL语句
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_idhttps://stackoverflow.com/questions/9117955
复制相似问题