Member 14778402 Ответов: 2

Как правильно использовать функцию count для внутреннего соединения, чтобы получить правильные результаты


Я написал некоторый sql-код, который не дает правильных результатов, которые я ищу. У меня есть 2 таблицы, одна из которых является записью заказа, а другая-накопительной таблицей. Я внутренне соединяю 2 таблицы и сохраняю свои результаты во временной таблице.
Проблема, которая у меня есть с кодом, заключается во внутреннем соединении, где я сопоставляю на основе столбцов cprj. Я хочу, чтобы функции count выполнялись в кумулятивной таблице для cprj, а функция sum-в таблице orderentry для столбца NoPartsPerLine. Что-то не так в коде после раздела " ON " внутреннего соединения.

Ответ, который я, кажется, получаю, заключается в том, что он подсчитывает строки в кумулятивной таблице, а затем умножает на # строк для того же cprj, который существует в таблице orderentry. Я попробовал оператор select top 1 для таблицы orderentry, но он вообще не дал никаких результатов. Когда (XMLLines.cprj) = PartList.cprj, это дает умноженный результат.

Результаты, которые я ищу, например:

cprj TotalRowCount DWRowCount SumNoPartsPerLine CumuCount
Тек#55555 60 8 25 6


Таблицы, которые я использую, таковы:

[OrderEntry] Table
ID	cprj		TotalRowCount		DWRowCount	NoPartsPerLine
1	TEK#7000	80			26		10
2	TEK#4444	50			30		2
3	TEK#88888	120			24		15
4	TEK#4700	37			13		6
5	TEK#99999	53			42		8
203	TEK#5555	60			8		10
203	TEK#5555	60			8		5
203	TEK#5555	60			8		5
203	TEK#5555	60			8		2
203	TEK#5555	60			8		3


и

[MatchingRowsRUwithRU-DWCALCS-DATA-ProjectCumulative] table
ID	cprj		item		PartNumber		SWITEM	QTY	
196	TEK#7000	A23-3171-X	A23-3171\2583		1.2	2	
197	TEK#5555	N02-0846-X	N02-0846A5\59\2583	2	1	
198	TEK#7000	N02-0846-X	N02-0846A5\59\2583	2	1	
199	TEK#5555	A23-1354-X	A23-1354\2583		2.3	2	
200	TEK#7000	A23-1354-X	A23-1354\2583		2.3	2	
201	TEK#7000	B11-0304-X	B11-0304\25		2.4	2	
202	TEK#7000	B11-0304-X	B11-0304\25		1.4	2	
203	TEK#5555	B11-0304-X	B11-0304\25		2.4	2	
204	TEK#5555	B11-0304-X	B11-0304\25		1.4	2	
205	TEK#5555	B11-0305-X	B11-0305\59		1.5	2	
206	TEK#5555	B11-0305-X	B11-0305\59		2.5	2	
207	TEK#7000	B11-0305-X	B11-0305\59		1.5	2	


Любая помощь будет оценена по достоинству!

Что я уже пробовал:

DECLARE @tmp TABLE (
    ID INT,
    [cprj] [varchar](500) NULL,
    [TotalRowCount] [int] NULL, 
    [DWRowCount] [int] NULL,
    [SumNoPartsPerLine] [int] NULL,
    [CumuCount] [int] NULL
)

----------------------------------------inner join between order entry and cumulative table and insert results into @tmp table

INSERT INTO @tmp
    (cprj, TotalRowCount, DWRowCount, SumNoPartsPerLine, CumuCount) 
SELECT
    XMLLines.[cprj],
    PartList.TotalRowCount,
    PartList.DWRowCount,
    sum (PartList.NoPartsPerLine) SumNoPartsPerLine,
    count (XMLLines.cprj) CumuCount
FROM 
    OrderEntry.dbo.OrderEntry as PartList
    INNER JOIN SSIS.dbo.[MatchingRowsRUwithRU-DWCALCS-DATA-ProjectCumulative] AS XMLLines 
    ON
        --(XMLLines.cprj) = PartList.cprj
        (Select top 1 cprj from OrderEntry.dbo.OrderEntry) = (XMLLines.cprj)
GROUP BY
    XMLLines.cprj, 
    PartList.DWRowCount, 
    TotalRowCount
;

SELECT * FROM @tmp

2 Ответов

Рейтинг:
9

k5054

Я не думаю, что тебе нужен временный стол. Следующее прекрасно работает в PostgreSQL. Нечто подобное должно работать и для SQL-сервера

SELECT parts.cprj, TotalRowCount, DWRowCount, SumNoPartsPerLine, cumul.CumuCount
   FROM (SELECT  cprj, TotalRowCount, DWRowCount, sum(NoPartsPerLine) as SumNoPartsPerLine
            FROM OrderEntry
            GROUP BY (cprj, TotalRowCount, DWRowCount) as parts
   INNER JOIN (SELECT cprj, count(cprj) as CumuCount
             FROM MatchingRowsRUwithRU-DWCALCS-DATA-ProjectCumulative
             GROUP BY cprj) as cumul
   ON parts.cprj = cumul.cprj


Member 14778402

Большое спасибо. Я тоже попробую это сделать.

Рейтинг:
13

Richard Deeming

Вам нужно будет сделать агрегацию до вы присоединяетесь к столам.

DECLARE @tmp TABLE 
(
    ID INT,
    [cprj] [varchar](500) NULL,
    [TotalRowCount] [int] NULL, 
    [DWRowCount] [int] NULL,
    [SumNoPartsPerLine] [int] NULL,
    [CumuCount] [int] NULL
);

WITH ctePartList As
(
    SELECT
        cprj,
        TotalRowCount,
        DWRowCount,
        Sum(NoPartsPerLine) As SumNoPartsPerLine
    FROM
        OrderEntry.dbo.OrderEntry
    GROUP BY
        cprj,
        TotalRowCount,
        DWRowCount
),
cteXmlLines As
(
    SELECT
        cprj,
        Count(1) As CumuCount
    FROM
        SSIS.dbo.[MatchingRowsRUwithRU-DWCALCS-DATA-ProjectCumulative]
    GROUP BY
        cprj
)
INSERT INTO @tmp
(
    cprj, 
    TotalRowCount, 
    DWRowCount, 
    SumNoPartsPerLine, 
    CumuCount
)
SELECT
    P.cprj,
    P.TotalRowCount,
    P.DWRowCount,
    P.SumNoPartsPerLine,
    X.CumuCount
FROM
    ctePartList As P
    INNER JOIN cteXmlLines As X
    ON X.cprj = P.cprj
;

SELECT * FROM @tmp;


Member 14778402

Большое спасибо! Ваша помощь была очень признательна. Отлично сработало! Данная совокупность вещей усугубляется :).