我有一个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)
所以我期望的是所有选定产品的总价值,请帮忙。
答案 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