簡體   English   中英

使用SQL連接檢索列中每個不同值的數據集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM