如何增加以产品ID分隔的价格

时间:2019-09-05 11:43:01

标签: sql sql-server

我有一个dbo.products,其中存储了所有产品。这些产品具有唯一的ID,名称,类别和价格。

在客户数据库(dbo.customers)中,将选定的订单用管道分隔成一列。例如"12|61|42|48|56|57"。是否可以根据客户的选择获得总价?因此,如果价格为10的产品的ID为12,价格为8的产品61为负,那么当产品列为"12|61"时结果应为18?

我尝试引用dbo.prices的ID,但一次只能选择一个价格。

select Price
  from [dbo].[products]
  where id in (12|61|42|48|56|57)

所以我期望的是所有选定产品的总价值,请帮忙。

2 个答案:

答案 0 :(得分:0)

将第三张表作为订单将客户选择的商品存储在该表中, 之后,管理外键,主键结构,该结构将识别客户和产品数据。

然后您将得到想要的东西。

使用查询

sum()用于计算总价等。

答案 1 :(得分:0)

因此,假设您从某个外部系统获取数据,并且您被迫接受订单将是管道分隔的垃圾。我们还假设您没有能力将此原始数据拆分为规范化格式,无法以适当的关系方式进行存储。因此,在这个世界上,您陷入了不良的数据模型,而您所能做的就是查询它。

您需要做的第一件事是将订单拆分为可用格式的方法。您可以使用内置的SPLIT函数,但是如果您由于使用的是旧版SQL Server而无法访问此函数,则可以编写自己的函数。这是一个示例:

CREATE FUNCTION [dbo].[split] (
    @string VARCHAR(MAX), 
    @delimiter CHAR(1))
 RETURNS TABLE
 AS
 RETURN
 (
    WITH Pieces(id, [start], [stop]) AS (
        SELECT 1, 1, CONVERT(INT, CHARINDEX(@delimiter, @string))
        UNION ALL
        SELECT ID + 1, [stop] + 1, CONVERT(INT, CHARINDEX(@delimiter, @string, [stop] + 1)) FROM Pieces WHERE [stop] > 0
    )
    SELECT 
        id,
        SUBSTRING(@string, [start], CASE WHEN [stop] > 0 THEN [stop] - [start] ELSE LEN(@String) END) AS item
    FROM 
        Pieces
 );

一旦有了适当的位置,就可以执行以下操作:

SELECT * FROM dbo.split('12|61|42|48|56|57', '|');

结果:

id  item
1   12
2   61
3   42
4   48
5   56
6   57

现在,您终于可以构造一个查询来将所有这些部分组合在一起。这是一个使用表变量的示例,因为我不得不猜测您的架构是什么样的:

DECLARE @customer TABLE (id INT, customer_name VARCHAR(20), [order] VARCHAR(50));
DECLARE @price TABLE (id INT, price INT);
INSERT INTO @customer SELECT 1, 'Fred', '1|2|3';
INSERT INTO @customer SELECT 2, 'Bill', '2|4';
INSERT INTO @customer SELECT 3, 'Mary', '3';
INSERT INTO @price SELECT 1, 5;
INSERT INTO @price SELECT 2, 3;
INSERT INTO @price SELECT 3, 2;
INSERT INTO @price SELECT 4, 1;
SELECT c.id, c.customer_name, COUNT(s.item) AS items_ordered, SUM(p.price) AS total_price FROM @customer c CROSS APPLY dbo.split(c.[order], '|') s INNER JOIN @price p ON p.id = s.item GROUP BY c.id, c.customer_name ORDER BY 1;

结果:

id  customer_name   items_ordered   total_price
1   Fred    3   10
2   Bill    2   4
3   Mary    1   2