获取所有行是否存在于当前查询结果中或否

时间:2015-11-17 14:24:09

标签: sql-server

首先抱歉这个糟糕的标题我不知道应该怎么命名。

我有一张桌子,里面有顾客和他们买的东西。 例如:

Customer_ID | Item_ID |
--------------------------
1           | 15      |
3           | 25      |
5           | 20      |
1           | 35      |

数据库适用于像拍卖这样的系统,因此所有项目都包含所有以前价格的历史记录。 例如:

Item_ID | Price | Date
--------------------------
15      | 200   | 4/11/2015
25      | 100   | 4/11/2015
20      | 250   | 4/11/2015
35      | 350   | 4/11/2015
15      | 3000  | 5/11/2015

我所做的是我遍历每个日期并获取当前登录用户的数据

因此,对于用户1,它将是: 2015年4月11日

Customer_ID | Item_ID | Price | Date
----------------------------------------
1           | 15      | 200   | 4/11/2015
1           | 35      | 350   | 4/11/2015

和2015年5月11日

Customer_ID | Item_ID | Price | Date
----------------------------------------
1           | 15      | 3000  | 5/11/2015

我想要的是每次迭代我想获得所有用户项目,但只改变价格的价值 例如: 2015年4月11日

Customer_ID | Item_ID | Price | Status
----------------------------------------
1           | 15      | 200   | --
1           | 35      | 350   | --

和2015年5月11日

Customer_ID | Item_ID | Price | Status
----------------------------------------
1           | 15      | 3000  | UP
1           | 35      | 350   | --

我想要的是我如何在每次迭代中进行迭代,并且在每次迭代中,我将显示某个客户拥有的所有物品,无论该物品是否在该日期,以及该物品在该特定日期是否有价格我将展示它之前的最新日期。

2 个答案:

答案 0 :(得分:1)

您可以使用:

SELECT DISTINCT c.Customer_ID, ip.Date
FROM ItemPrice AS ip
INNER JOIN Customers AS c ON ip.Item_ID = c.Item_ID

为了获得Customer_ID的所有不同日期。

<强>输出:

Customer_ID Date
----------------------
1           2015-04-11 
1           2015-05-11 
3           2015-04-11 
5           2015-04-11 

您可以在CTE中包含上述查询,然后对此LEFT JOIN执行CTE,以获得Item_ID - {{1}之间的所有可能组合}:

Date

上述查询使用;WITH DatesCTE AS ( SELECT DISTINCT c.Customer_ID, ip.Date FROM ItemPrice AS ip INNER JOIN Customers AS c ON ip.Item_ID = c.Item_ID ) SELECT Customer_ID, Item_ID, COALESCE(Price, prevPrice) AS Price, CASE WHEN prevPrice > Price THEN 'DOWN' WHEN prevPrice = Price THEN 'EQUAL' WHEN prevPrice < Price THEN 'UP' ELSE '---' END AS Status FROM ( SELECT c.Customer_ID, c.Item_ID, dc.Date, ip.Price, LAG(ip.Price) OVER (PARTITION BY c.Customer_ID, c.Item_ID ORDER BY dc.Date) AS prevPrice FROM Customers AS c LEFT JOIN DatesCTE AS dc ON c.Customer_ID = dc.Customer_ID LEFT JOIN ItemPrice AS ip ON c.Item_ID = ip.Item_ID AND dc.Date = ip.Date ) AS t ORDER BY Customer_ID, Date 来比较当前和上一个项目之间的价格。可以使用这两个值来确定结果的LAGPrice字段。

Demo here

答案 1 :(得分:0)

这样的东西?

  

选择customer_id,item_id,价格
  来自客户c左侧加入历史记录h在c.item_id = h.item_id
上   其中date =&#39; 2015-11-04&#39;和customer_id = 1

您的问题不明确,但left join将为所有用户输出数据,即使指定日期没有数据。