[英]Using SQL join to retrieve set of data for each different value in a column
我正在從SQL Server的兩個SQL表中檢索數據,在其中我試圖從右表中獲取左表中列中每個不同值的所有行,無論是否存在匹配項
例如,我有兩個名為products的表,並處理以下數據
產品表
Id Product
1 ABC
2 XYZ
3 PQR
交易表
Id TradeDate Product Volume Price Delivery
56 2014-12-08 ABC 2500 -3.25 2015-01-01
57 2014-12-08 ABC 2500 -3.4 2015-02-01
63 2014-12-08 PQR 2500 -7 2015-01-01
64 2014-12-08 PQR 2500 -7 2015-01-01
我對以下表格應用了以下查詢
SELECT
FORMAT(a.Delivery,'MMMM yyyy') AS Delivery,
b.Product,COUNT(a.Id) AS Trades,
ROUND(((6.2898*SUM(a.Volume ))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001,4) AS BBLperDay,
SUM(a.Volume) AS M3,
ROUND(SUM(a.Volume*a.Price)/Sum(a.Volume),4) AS WeightedAverage
FROM Deals AS a right outer join Products AS b
ON a.Product=b.Product
AND CAST(a.TradeDate as date)='2014-12-08'
GROUP BY b.Product,CAST(a.TradeDate as date),
DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery),0), FORMAT(a.Delivery,'MMMM yyyy')
我得到了以下結果
Delivery Product Trades BBLperDay M3 WeightedAverage
January 2015 ABC 1 0.5072 2500 -3.25
February 2015 ABC 1 0.5616 2500 -3.4
January 2015 PQR 2 1.0145 5000 -7
(null) XYZ 0 (null) (null) (null)
以上結果是查詢的預期結果,但我正在嘗試一種獲取結果的方法,以便通過使每個等效結果和其他字段的默認Delivery value
Delivery
,從上述結果中,使Products table
中的每個行具有每個不同的Delivery
值。 NULL
如下
Delivery Product Trades BBLperDay M3 WeightedAverage
January 2015 ABC 1 0.5072 2500 -3.25
January 2015 PQR 2 1.0145 5000 -7
January 2015 XYZ 0 (null) (null) (null)
February 2015 ABC 1 0.5616 2500 -3.4
February 2015 XYZ 0 (null) (null) (null)
February 2015 PQR 0 (null) (null) (null)
以上結果可以從實際結果中得到解釋,我有2015年1月交付的產品ABC和PQR,但Products表又是另外一個產品XYZ,2015年1月缺失了,所以我添加了XYZ於2015年1月,交付為2015年1月,其余空值。 與2015年2月交貨的情況相同,它只有ABC,因此我在結果中添加了產品XYZ和PQR。
請參考http://sqlfiddle.com/#!6/db1508/3
May I know a good way to get this data?
我只是先構建交付產品的“主干”,然后用左聯接將您的原始查詢針對它。 與CTE一起顯示在此處。
WITH deliveryProducts AS
(
SELECT DISTINCT FORMAT(a.Delivery,'MMMM yyyy') AS Delivery, b.Product
FROM DEALS as a, PRODUCTS as b Where CAST(a.TradeDate as date)='2014-12-08'
)
, deliveryActuals AS
(
SELECT
FORMAT(a.Delivery,'MMMM yyyy') AS Delivery,
b.Product,ISNULL(COUNT(a.Id),0) AS Trades,
ROUND(((6.2898*SUM(a.Volume ))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001,4) AS BBLperDay,
SUM(a.Volume) AS M3,
ROUND(SUM(a.Volume*a.Price)/Sum(a.Volume),4) AS WeightedAverage
FROM
Deals AS a right outer join Products AS b
ON a.Product=b.Product
AND CAST(a.TradeDate as date)='2014-12-08'
GROUP BY
b.Product,CAST(a.TradeDate as date),
DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery),0), FORMAT(a.Delivery,'MMMM yyyy')
)
SELECT
dp.Delivery, dp.Product, trades, BBLperDay, M3, WeightedAverage
FROM
deliveryProducts dp
LEFT JOIN deliveryActuals da
on dp.Delivery = da.Delivery
and dp.product = da.Product
ORDER BY dp.Delivery
它在您的SQLFiddle中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.