2015-06-26 4 views
0

У меня проблема с TOP и JOIN в SQL.SQL TOP и Join challenge

У меня есть две таблицы INVENTTABLE и IKMTECHSPECPROD.

INVENTTABLE содержит все продукты, которые у нас есть.

IKMTECHSPECPROD содержит все технические условия на продукцию.

Для одного продукта может быть множество технических характеристик. Теперь я хочу, чтобы экспортировать все продукты и 12 первые технические спецификации для каждого продукта, и я хочу в одну строчку для каждого продукта

Пример:

ItemID, ItemName, spec1name, spec1value, spec2name, spec2value, spec3name, spec3 value..... 

Я попытался SQL запрос ниже, но это дает мне:

ItemID, ItemName, spec1name, spec2value 
ItemID, ItemName, spec2name, spec2value 
ItemID, ItemName, spec3name, spec3value 

Запрос:

SELECT 
    invent.ITEMID, ITEMNAME, 
    [techspec].NAME, [techspec].VALUE 
FROM 
    [INVENTTABLE] invent 
CROSS APPLY 
    (SELECT TOP 12 
     [IKMTECHSPECPROD].NAME, IKMTECHSPECPROD.VALUE 
    FROM [IKMTECHSPECPROD] 
    WHERE [IKMTECHSPECPROD].ITEMID = invent.ITEMID) techspec 

Кто знает, как решить эту проблему?

+0

Вы ищете что-то вроде этого? http://stackoverflow.com/questions/12671117/comma-separated-values-with-sql-query –

ответ

0

Я думаю, что вы можете использовать группу по

SELECT 
    invent.ITEMID, ITEMNAME, 
    [techspec].NAME, [techspec].VALUE 
FROM 
    [INVENTTABLE] invent 
CROSS APPLY 
    (SELECT TOP 12 
     [IKMTECHSPECPROD].NAME, IKMTECHSPECPROD.VALUE 
    FROM [IKMTECHSPECPROD] 
    WHERE [IKMTECHSPECPROD].ITEMID = invent.ITEMID 
    group by [IKMTECHSPECPROD].NAME, IKMTECHSPECPROD.VALUE 
) techspec 
1

Вы можете написать запрос, как:

SELECT DISTINCT 
    T2.ItemID, 
    STUFF 
    (
     (
      SELECT TOP 12 ',' + specifications 
      FROM @IKMTECHSPECPROD T1 
      WHERE T1.ItemID = T2.ItemID 
      ORDER BY specifications 
      FOR XML PATH('') 
     ), 1, 1, '' 
    ) AS specs 
FROM 
    @INVENTTABLE T2 

DEMO

0

Если вы хотите, отдельные колонки для каждого 12 спецификации имя и это также может сделать следующее:

IF OBJECT_ID('MyTable','U') IS NOT NULL 
    DROP TABLE MyTable 
GO 
CREATE TABLE MyTable 
(
    ItemID INT, 
    ItemName VARCHAR(30), 
    SpecName VARCHAR(30), 
    SpecValue VARCHAR(30) 
) 
GO 
INSERT INTO MyTable 
      (ItemID, ItemName, SpecName, SpecValue) 
VALUES  (1, 'Item1', 'Item1Spec1', 'Item1Value1'), 
      (1, 'Item1', 'Item1Spec2', 'Item1Value2'), 
      (1, 'Item1', 'Item1Spec3', 'Item1Value3'), 
      (1, 'Item1', 'Item1Spec4', 'Item1Value4'), 
      (2, 'Item2', 'Item2Spec1', 'Item2Value1'), 
      (2, 'Item2', 'Item2Spec2', 'Item2Value2'), 
      (3, 'Item3', 'Item3Spec1', 'Item3Value1'), 
      (3, 'Item3', 'Item3Spec2', 'Item3Value2'), 
      (3, 'Item3', 'Item3Spec3', 'Item3Value3'), 
      (4, 'Item4', 'Item4Spec1', 'Item4Value1') 


SELECT ItemID,ItemName, 
MAX(CASE WHEN ItemSpecNo = 1 THEN SpecName END) AS [spec1name], 
MAX(CASE WHEN ItemSpecNo = 1 THEN SpecValue END) AS [spec1value], 
MAX(CASE WHEN ItemSpecNo = 2 THEN SpecName END) AS [spec2name], 
MAX(CASE WHEN ItemSpecNo = 2 THEN SpecValue END) AS [spec2value], 
MAX(CASE WHEN ItemSpecNo = 3 THEN SpecName END) AS [spec3name], 
MAX(CASE WHEN ItemSpecNo = 3 THEN SpecValue END) AS [spec3value], 
MAX(CASE WHEN ItemSpecNo = 4 THEN SpecName END) AS [spec4name], 
MAX(CASE WHEN ItemSpecNo = 4 THEN SpecValue END) AS [spec4value], 
MAX(CASE WHEN ItemSpecNo = 5 THEN SpecName END) AS [spec5name], 
MAX(CASE WHEN ItemSpecNo = 5 THEN SpecValue END) AS [spec5value], 
MAX(CASE WHEN ItemSpecNo = 6 THEN SpecName END) AS [spec6name], 
MAX(CASE WHEN ItemSpecNo = 6 THEN SpecValue END) AS [spec6value], 
MAX(CASE WHEN ItemSpecNo = 7 THEN SpecName END) AS [spec7name], 
MAX(CASE WHEN ItemSpecNo = 7 THEN SpecValue END) AS [spec7value], 
MAX(CASE WHEN ItemSpecNo = 8 THEN SpecName END) AS [spec8name], 
MAX(CASE WHEN ItemSpecNo = 8 THEN SpecValue END) AS [spec8value], 
MAX(CASE WHEN ItemSpecNo = 9 THEN SpecName END) AS [spec9name], 
MAX(CASE WHEN ItemSpecNo = 9 THEN SpecValue END) AS [spec9value], 
MAX(CASE WHEN ItemSpecNo = 10 THEN SpecName END) AS [spec10name], 
MAX(CASE WHEN ItemSpecNo = 10 THEN SpecValue END) AS [spec10value], 
MAX(CASE WHEN ItemSpecNo = 11 THEN SpecName END) AS [spec11name], 
MAX(CASE WHEN ItemSpecNo = 11 THEN SpecValue END) AS [spec11value], 
MAX(CASE WHEN ItemSpecNo = 12 THEN SpecName END) AS [spec12name], 
MAX(CASE WHEN ItemSpecNo = 12 THEN SpecValue END) AS [spec12value] 
FROM 
(
SELECT *,ROW_NUMBER()OVER (PARTITION BY itemID ORDER BY itemID) AS ItemSpecNo FROM MyTable 
) t 
GROUP BY ItemID,ItemName