如何在sql中合并两列并创建一个新列



我必须将两列合并到一个具有不同值的列中我写了这个代码,但我无法继续:

SELECT Title, ...
FROM BuyItems

输入:

| title |  UK |  US | total |
|-------|-----|-----|-------|
| coca  |  3  |  5  |   8   |
| cake  |  2  |  0  |   2   |

输出:

|title |Origin | Total|
|------|-------|------|
|coca  |  UK   |   3  |
|coca  |  US   |   5  |
|cake  |  US   |   2  |

您可以使用CROSS APPLY和表值构造函数来执行此操作:

-- EXAMPLE DATA START
WITH BuyItems AS
(   SELECT  x.title, x.UK, x.US
FROM    (VALUES ('coca', 3, 5), ('cake', 2, 0)) x (title, UK, US)
)
-- EXAMPLE DATA END
SELECT bi.Title, upvt.Origin, upvt.Total
FROM BuyItems AS bi
CROSS APPLY (VALUES ('UK', bi.UK), ('US', bi.US)) upvt (Origin, Total)
WHERE upvt.Total <> 0;

或者,您可以使用UNPIVOT功能:

-- EXAMPLE DATA START
WITH BuyItems AS
(   SELECT  x.title, x.UK, x.US
FROM    (VALUES ('coca', 3, 5), ('cake', 2, 0)) x (title, UK, US)
)
-- EXAMPLE DATA END
SELECT upvt.Title, upvt.Origin, upvt.Total
FROM BuyItems AS bi
UNPIVOT (Total FOR Origin IN (UK, US)) AS upvt
WHERE upvt.Total <> 0;

我通常更喜欢前者,因为它更灵活。可以使用显式强制转换组合不同类型的列,也可以取消透视多个列。UNPIVOT工作得很好,没有理由不使用它,但由于UNPIVOT在有限的场景中工作,而CROSS APPLY/VALUES在所有场景中都工作,所以我只选择此选项作为默认选项。

使用apply:

select v.*
from t cross apply
(values (t.title, 'UK', uk), (t.title, 'US', us)
) v(title, origin, total)
where v.total > 0;

这是一个简单的unpivot:

SELECT YT.title,
V.Origin,
V.Total
FROM dbo.YourTable YT
CROSS APPLY (VALUES('UK',UK),
('US',US))V(Origin,Total);

最新更新