Sql server 2008 r2 SQLServer2008中针对动态列的算术运算符
我需要创建以下表格和结果:Sql server 2008 r2 SQLServer2008中针对动态列的算术运算符,sql-server-2008-r2,pivot,dynamic-pivot,Sql Server 2008 R2,Pivot,Dynamic Pivot,我需要创建以下表格和结果: -- tblPart PartCode[NVARCHAR(50)],UnitPrice[Decimal(18,2)] SELECT * INTO #tblPart FROM( SELECT 'A' PartCode, '10' UnitPrice UNION All SELECT 'B','11' UNION All SELECT 'C','38' UNION All SELECT 'D','20' UNION All SELECT 'E','12')part; -
-- tblPart PartCode[NVARCHAR(50)],UnitPrice[Decimal(18,2)]
SELECT * INTO #tblPart FROM(
SELECT 'A' PartCode, '10' UnitPrice
UNION All
SELECT 'B','11'
UNION All
SELECT 'C','38'
UNION All
SELECT 'D','20'
UNION All
SELECT 'E','12')part;
-- tblPartCondition ConditionCode[NVARCHAR(50)],PercentagePrice[Decimal(18,2)]
SELECT * INTO #tblPriceCondition FROM(
SELECT 'Weekly' ConditionCode, '3' PercentagePrice
UNION All
SELECT 'Urgent','-5'
UNION All
SELECT 'Hotline','-10'
UNION All
SELECT 'Normal','0')pricecondition
SELECT PartCode,
[Weekly]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Weekly'),
[Urgent]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Urgent'),
[Hotline]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Hotline'),
[Normal]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Normal')
FROM #tblPart p
DROP TABLE #tblPart
DROP TABLE #tblPriceCondition
PartCode Weekly Urgent Hotline Normal
........ ...... ...... ....... ......
A 10.03 9.95 9.9 10
B 11.03 10.95 10.9 11
C 38.03 37.95 37.9 38
D 20.03 19.95 19.9 20
E 12.03 11.95 11.9 12
结果如下:
-- tblPart PartCode[NVARCHAR(50)],UnitPrice[Decimal(18,2)]
SELECT * INTO #tblPart FROM(
SELECT 'A' PartCode, '10' UnitPrice
UNION All
SELECT 'B','11'
UNION All
SELECT 'C','38'
UNION All
SELECT 'D','20'
UNION All
SELECT 'E','12')part;
-- tblPartCondition ConditionCode[NVARCHAR(50)],PercentagePrice[Decimal(18,2)]
SELECT * INTO #tblPriceCondition FROM(
SELECT 'Weekly' ConditionCode, '3' PercentagePrice
UNION All
SELECT 'Urgent','-5'
UNION All
SELECT 'Hotline','-10'
UNION All
SELECT 'Normal','0')pricecondition
SELECT PartCode,
[Weekly]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Weekly'),
[Urgent]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Urgent'),
[Hotline]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Hotline'),
[Normal]=p.UnitPrice + (SELECT (CAST(c.PercentagePrice AS DECIMAL(18,2))/100) FROM #tblPriceCondition c WHERE c.ConditionCode='Normal')
FROM #tblPart p
DROP TABLE #tblPart
DROP TABLE #tblPriceCondition
PartCode Weekly Urgent Hotline Normal
........ ...... ...... ....... ......
A 10.03 9.95 9.9 10
B 11.03 10.95 10.9 11
C 38.03 37.95 37.9 38
D 20.03 19.95 19.9 20
E 12.03 11.95 11.9 12
上述查询基于#tblPartCondition,Pls中的已知列。你知道专栏是未知的吗?(例如,如果用户添加新的PercentageCode,PercentagePrice)。
我很感激你珍惜时间和分享。谢谢 获取pivot的列
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + ConditionCode + ']', '[' + ConditionCode + ']')
FROM (SELECT DISTINCT ConditionCode FROM #tblPriceCondition) PV
ORDER BY ConditionCode
使用CROSS-JOIN
获取每个PartCode
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT PartCode,' + @cols + ' FROM
(
SELECT PARTCODE,ConditionCode,
CAST(UnitPrice + CAST(PercentagePrice AS DECIMAL(18,2))/100 AS DECIMAL(18,2)) VALUE
FROM #tblPart
CROSS JOIN #tblPriceCondition
) x
PIVOT
(
MIN(VALUE)
FOR ConditionCode IN (' + @cols + ')
) p
'
EXEC SP_EXECUTESQL @query
- 查看结果
将更新。在这种情况下,人们通常建议根据
tblpricecodition
表中的实际值动态构建PIVOT
查询。谢谢@Vladimir Baranov,但是我不知道PIVOT查询,您能提供一些代码吗?这应该给你一个很好的起点——结果必须包含负值。价格条件的公式为单价+(百分价格/100)。百分比价格可能是-10,5,…我真的很感谢你的帮助。这真的很有帮助。非常感谢。如果我想为partcode添加可选参数:“其中partcode=(add)partcode或(add)partcode为NULL”,则在“交叉连接#tblPriceCondition”下返回0值。有什么想法吗?对不起,回复太晚了。我太忙了。只需给出其中PARTCODE='''+@PARTCODE+''或其中PARTCODE在p之后和关闭动态sql之前为NULL@Sokeatried,但如果我传递值PartCode=NULL,仍然返回0值,我的逻辑是,如果将NULL值传递给PartCode,它将返回所有PartCode数据。