在SQL中使用临时表来生成和填充"数据模板"

时间:2014-04-16 18:34:35

标签: sql

所以,让我们说我有一张桌子,打电话给它'命令'看起来像这样:

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

2 个答案:

答案 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