所以,让我们说我有一张桌子,打电话给它'命令'看起来像这样:
customer|order_type|price
-------- ---------- -----
"Bob" |"Delivery"|100
"Nancy" |"Delivery"|200
客户可以是任何名称,而order_type可以是'交付'或者'皮卡'
如果我有一个(临时)帮助程序表,它只包含order_type字段,其中包含两行,每个订单类型一行,我可以编写这样的查询并接近我想要的内容
SELECT
customer, temp.order_type
FROM
(SELECT order_type FROM helper) temp
LEFT JOIN
orders ON temp.order_type = orders.order_type AND name = 'Bob'
这将给我以下内容:
customer|order_type|price
-------- ---------- -----
NULL |"Pickup" |NULL
"Bob" |"Delivery"|100
"Nancy" |"Delivery"|200
如何使输出看起来像这样:
customer|order_type|price
-------- ---------- -----
"Bob" |"Pickup" |NULL
"Bob" |"Delivery"|100
"Nancy" |"Pickup" |NULL
"Nancy" |"Delivery"|200
FWIW,这是我最终目标的一个高度简化的例子,并且为了这个最终目标,假设我不能只创建单独的记录,其中包括价格和价格。是NULL
答案 0 :(得分:1)
由于您使用的是专有数据库,因此无法保证此功能正常,但这是ANSI的一种做法:
SELECT
name,order_type,price
FROM
orders
UNION
SELECT DISTINCT
name,helper.order_type,null
FROM
orders
CROSS JOIN helper
WHERE
(name,helper.order_type)
NOT IN (SELECT name,order_type
FROM orders)
ORDER BY
1,2
一个更简单但更脆弱的解决方案是:
SELECT DISTINCT
name,
helper.order_type,
sum(CASE WHEN orders.order_type=helper.order_type
THEN price
ELSE null end) price
FROM
orders
CROSS JOIN helper
GROUP BY
name,helper.order_type
SQL Fiddle here - 我添加了一些额外的值来说明效果。
答案 1 :(得分:0)
我能够使用两个子查询获得该结果。 You can check it out in this SQL Fiddle。它是为SQL Server 2012设置的,但我认为您可以将它与内部系统配合使用。
SELECT s1.Customer, s1.Order_Type, s2.Price
FROM (
SELECT o.Customer, t.Order_Type
FROM dbo.Orders o
CROSS JOIN dbo.Helper t
) s1
LEFT JOIN (
SELECT Customer, Order_Type, Price
FROM dbo.Orders
) s2 ON s1.Customer = s2.Customer AND s1.Order_Type = s2.Order_Type
ORDER BY Customer, Order_Type, Price