【问题标题】:Arithmetic operators against dynamic column in SQL Server 2008SQL Server 2008 中针对动态列的算术运算符
【发布时间】:2015-04-02 04:19:20
【问题描述】:

我有查询要在下面创建表和结果:

-- 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 中的已知列,请。知道列是否未知吗? (例如,如果用户添加新的 PercentageCode、PercentagePrice)。 我会很感激你的宝贵时间和分享。谢谢!

【问题讨论】:

标签: sql-server-2008-r2 pivot dynamic-pivot


【解决方案1】:

获取数据透视列

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + ConditionCode + ']', '[' + ConditionCode + ']')
               FROM (SELECT DISTINCT ConditionCode FROM #tblPriceCondition) PV 
               ORDER BY ConditionCode

使用CROSS JOIN 为每个PartCode 获取ConditionCodePercentagePrice

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 

请回复如何处理负值。
会更新。

【讨论】:

  • 结果必须包含负值。价格条件公式为UnitPrice+(PercentagePrice/100)。 PercentagePrice 可以是 -10、5、..
  • 非常感谢您的帮助。这真的很有帮助。非常感谢。
  • 如果我想在 'CROSS JOIN #tblPriceCondition' 下为 partcode 添加可选参数:'WHERE PartCode=(add)PartCode OR (add)PartCode IS NULL',它返回 0 值。请有任何想法。
  • 抱歉回复晚了。太忙了。只需在 p 之后和动态 sql 关闭之前给出 WHERE PARTCODE ='''+@PARTCODE+'''WHERE PARTCODE IS NULL 即可。 @Sokea
  • 尝试但如果我传递值 PartCode=NULL 仍然返回 0 值,我的逻辑是如果将 NULL 值传递给 PartCode 它将返回所有 PartCode 数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2017-08-31
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多