2016-12-05 69 views
1

我有如下所述的要求。查詢需要獲取SQL Server 2008 R2數據庫上的數據。用逗號分隔連接表格和返回數據

盡我所能提取數據如下所述,但不能。非常感謝您的幫助。

Product_table

SKU UPC Details Weight Color 
223 111 TShirt 25  White 
224 114 Pants  25  Black 
225 115 Abc  29  Yellow 
230 116 XyX  23  Pink 
226 117 AXYz  25  Red 
226 118 Abdc  26  White 
228 119 Abcr  20  Pink 
229 120 Abcy  22  Green 

Custom_tbl

SKU Custom_name Custom_value 
223  Pickup   true 
223  eligible   false 
223  size    medium 
223  map    red 
224  pickup   false 
224  eligible   false 
224  map    green 
225  Pickup   true 
225  eligible   true 
225  size    large 
225  department  001 
225  availability  true 
226  Pickup   true 
226  size    large 
226  map    blue 
226  availability  true 
229  eligible   true 

從提到查詢以上兩個表需要如後所述,以獲取數據。

注意:CustomValues(示例表中的第六列)用逗號分隔,我只需要3個值(Custom_tbl中的拾取,符合條件的映射列和其餘部分需要忽略;如果任何custom_name不可用,則它應該返回空字符串(從第3行檢查),如下所示)

SKU UPC DETAILS WEIGHT COLOR  CustomValues 
223 111 TShirt 25  White  true,false,red 
224 114 Pants  25  Black  false,false,green 
225 115 Abc  29  Yellow  true,true, 
226 118 Abdc  26  White  true,,blue 
228 119 Abcr  20  Pink  ,,, 
229 120 Abcy  22  Green  ,true, 

任何能幫助我在修改了上述相同數據的查詢,但我需要排除其CUSTOM_NAME可享有和價值是虛假數據。我有這個查詢得到我正在尋找原始問題,但無法添加我正在尋找的條件。感謝您的幫助。

對於上述相同的數據,我需要排除其Custom_name符合條件且值爲false的數據。我有這樣的查詢,但無法添加上述邏輯

SELECT productDetails.sku, Isnull(productDetails.sku, '') + ',' 
     + Isnull(productDetails.upc, '') + ',' 
     + Isnull(productDetails.details, '') 
     + ',' + CustomValues 
     FROM (SELECT PD.*, 
       Stuff((SELECT ',' + Attributes.customval 
        FROM (SELECT 
        A.sku, 
        Isnull(Max(A.[Pickup]), '') + ',' 
        + Isnull(Max(A.[eligible]), '') + ',' 
        + Isnull(Max(A.[size]), '') AS customVal 
        FROM (SELECT sku, Isnull(CASE WHEN custom_name = 'Pickup' THEN Max(custom_value) END, '') AS 'Pickup', 
             Isnull(CASE WHEN custom_name = 'eligible' THEN Max(custom_value) END, '') AS 'eligible', 
             Isnull(CASE WHEN custom_name = 'size' THEN Max(custom_value) END, '') AS 'size' 
          FROM [product_custom_details] 
          GROUP BY sku, custom_field_name) AS A              
          GROUP BY A.sku) Attributes 
         WHERE Attributes.sku = PD.sku 
         FOR xml path('')), 1, 1, '') AS CustomValues 
     FROM [product_details] PD) AS productDetails 
ORDER BY productDetails.sku 
+0

'「我只需要3個值按順序」,那是什麼順序? –

+0

檢查東西的功能,這將在這裏解決你的問題 – Veljko89

回答

0

您可以Custom_tbl表使用GROUP BYSKU和應用情況,以獲得個人自定義值

SELECT 
    SKU, 
    ISNULL(CASE WHEN Custom_name = 'Pickup' THEN Custom_value END,'') + ',' 
    ISNULL(CASE WHEN Custom_name = 'eligible' THEN Custom_value END,'') + ',' 
    ISNULL(CASE WHEN Custom_name = 'map' THEN Custom_value END,'') as CustomValues 
FROM Custom_tbl 
WHERE Custom_name IN ('Pickup','eligible','map') 
GROUP BY SKU 

現在剛剛與主表加入這個每sku

SELECT P.SKU, UPC, DETAILS, WEIGHT, COLOR, ISNULL(C.CustomValues,'') as CustomValues 
FROM Product_table P 
LEFT JOIN(
    SELECT 
     SKU, 
     ISNULL(CASE WHEN Custom_name = 'Pickup' THEN Custom_value END,'') + ',' 
     ISNULL(CASE WHEN Custom_name = 'eligible' THEN Custom_value END,'') + ',' 
     ISNULL(CASE WHEN Custom_name = 'map' THEN Custom_value END,'') as CustomValues 
    FROM Custom_tbl 
    WHERE Custom_name IN ('Pickup','eligible','map') 
    GROUP BY SKU 
)C ON P.sku = C.sku 
+0

感謝每一位爲你提供的大力幫助。我得到了我正在尋找的東西。 –

1

試試這個:

SELECT DISTINCT P.SKU,P.UPC,Details,P.[Weight],P.[Color], 
STUFF((SELECT ',' + Custom_value 
     from Custom_tbl 
     where SKU=P.SKU FOR XML PATH('')),1,1,'') AS Customvalues 
FROM Product_table P 
0
DECLARE @Product_Table AS TABLE (SKU INT, UPC INt, Details VARCHAR(100), Weight INT, Color VARCHAR(100)) 
DECLARE @Custom_Tbl AS TABLE (SKU INT, Custom_Name VARCHAR(100), Custom_Value VARCHAR(100)) 

INSERT INTO @Product_Table VALUES (223,111,'TShirt',25,'White'),(224,114,'Pants',25,'Black') 
,(225,115,'Abc',29,'Yellow'),(230,116,'XyX',23,'Pink'),(226,117,'AXYz',25,'Red') 
,(226,118,'Abdc',26,'White'),(228,119,'Abcr',20,'Pink'),(229,120,'Abcy',22,'Green') 

INSERT INTO @Custom_Tbl VALUES (223,'Pickup','true'),(223,'eligible','false'),(223,'size','medium') 
,(223,'map','red'),(224,'pickup','false'),(224,'eligible','false'),(224,'map','green') 
,(225,'Pickup','true'),(225,'eligible','true'),(225,'size','large'),(225,'department','001') 
,(225,'availability','true'),(226,'Pickup','true'),(226,'size','large'),(226,'map','blue') 
,(226,'availability','true'),(229,'eligible','true') 


;WITH cteCustomNames AS (
    SELECT * 
    FROM 
     (VALUES ('Pickup',1),('eligible',2),('map',3)) t(Custom_name,StringOrder) 
) 

, cteProductRowNum AS (
    SELECT 
     p.* 
     ,RowNum = ROW_NUMBER() OVER (PARTITION BY p.SKU ORDER BY Weight) 
    FROM 
     @Product_Table p 
) 

SELECT * , STUFF(
      (SELECT ',' + ISNULL(Custom_value,'') 
      FROM 
      cteCustomNames cn 
      LEFT JOIN @Custom_Tbl c 
      ON cn.Custom_name = c.Custom_Name 
      AND c.SKU = p.SKU 
      ORDER BY 
      cn.StringOrder 
      FOR XML PATH('')) 

     ,1,1,'') 
FROM 
    cteProductRowNum p 
WHERE 
    p.RowNum = 1 

所以你實際上可以有一些棘手的部分到您的查詢。首先,您顯示逗號位置即使該位置不退出。這需要交叉或左連接來拉開。您顯示的結果將是每個SKU 1行,但在您的產品表中顯示多個產品SKU因此您需要一個排名函數來確定您想要的行。無論如何,這是完成這一切的一種方式。像其他人一樣,我也建議使用STUFF()與FOR XML進行連接。哦,你提到你想要特定順序的字符串。