【问题标题】:SQL split totalsSQL 拆分总计
【发布时间】:2021-06-02 12:09:00
【问题描述】:

目前我在 SQL 中有以下结果:

qty description volume weight
4 Flowers 3,4 4

这是一种 XML 格式。所以我想做什么,我想我需要以某种方式使用“FOR XML PATH”,但我不确定如何实现以下结果:

qty description volume weight
1 Flowers 0,85 1
1 Flowers 0,85 1
1 Flowers 0,85 1
1 Flowers 0,85 1

所以我需要根据总数量(4)划分XML路径。对于每 (4) 个产品,我需要创建一个新行。然后除以体积和重量(/qty)。

谁能帮我把我推向正确的方向?

编辑: 第一个结果,数量为 4,是临时表中的结果。 我将临时表中的数据提取为 XML 格式。这是一个sn-p

(SELECT "qty" = value('(@col24)[1]', 'varchar(50)'),  "weight"  = value('(@col28)[1]', 'varchar(50)'), "volume" = value('(@col26)[1]', 'decimal(16,2)') FOR XML PATH('product'), ROOT('products'), TYPE)  

数量、重量和体积代表总数。 这就是我想要为每个“数量”创建一个“产品”的原因。

【问题讨论】:

  • 你使用的是microsoft sql server 数据库吗?
  • 也分享你当前的sql..
  • 我确实在使用 SQL Server
  • 您自相矛盾地说您有 SQL 中的结果,但它是一种 XML 格式。它是哪一个?你的实际输入是什么样的?就此而言,您的输出是什么样的——应该是行还是 XML?
  • 您可以(并且应该)edit 您的问题以包含更多详细信息; cmets 是一个糟糕的媒介,因为当涉及大量代码时,它们既不持久也不特别可读。

标签: sql sql-server xml tsql


【解决方案1】:

您可以使用递归 CTE 来拆分行(如果数量可能高于 100,则可能需要提高递归限制)。

declare @Test table (qty int, [description] varchar(64), volume decimal(9,2), [weight] decimal(9,2))

insert into @Test (qty, [description], volume, [weight]) values (4, 'Flowers', 3.4, 4);

with cte as (
  select qty, [description], volume, [weight], 1 as rn
  from @Test
  union all
  select qty, [description], volume, [weight], rn + 1
  from cte
  where rn < qty
)
select 1 qty, [description], cast(volume / qty as decimal(9,2)) volume, cast([weight] / qty as decimal(9,2)) [weight]
from cte
for xml path('product'), root('products'), type;
-- option (maxrecursion 200); -- If you need to increase it above the default of 100

注意:如果您设置 DDL+DML,如我所示,在您的问题中,您会更容易让人们回复。

【讨论】:

    【解决方案2】:

    一种方法是递归 CTE:

    WITH cte AS (
        SELECT *, qty AS cc, 1 org FROM #sale 
        UNION ALL 
        SELECT cte.qty /qty
             , cte.description
             , cte.volume /qty
             , cte.weight /qty
             , cte.cc - 1 AS cc 
             ,  0 org
        FROM cte
        WHERE cc > 1
        )
    
    SELECT * FROM cte
    where org = 0 
    FOR XML path
    

    但是,如果您有一个计数表,它会更快更简单:

    SELECT qty /qty
         , description
         , volume /qty
         , weight /qty
    FROM table
    JOIN numbertables < -- number tables from 1 to max
      on  numbertables.values < qty
    FOR XML path
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多