SQL - Сводная таблица, как исправить ошибку «Не удалось связать многоэлементный идентификатор«… »». - PullRequest
0 голосов
/ 13 сентября 2018

Я новый специалист по SQL Server / T-SQL и на некоторое время застрял в проблеме:

У меня есть таблица SQL (содержащая более 100 000 строк) для использования в сочетании с MS Excel. Я пытаюсь записать «хранимую процедуру», автоматизирующую некоторые исправления данных. Часть моих данных и ожидаемые результаты следующие:

Current Data                    
Date    Shift   WSNo    WONo    StockNo PTime   BDPlanned
04.01.2017  1   JP-MAK-053  7148    21842   2.250,00    0
04.01.2017  1   JP-MAK-053  7148    21842   26.550,00   2.961,00
04.01.2017  1   JP-MAK-053  7148    21843   0           0
04.01.2017  1   JP-MAK-053  7148    21843   0           0

Expected Result                 
Date    Shift   WSNo    WONo    StockNo PTime   BDPlanned
04.01.2017  1   JP-MAK-053  7148    21842   28.800,00   2.961,00
04.01.2017  1   JP-MAK-053  7148    21843   28.800,00   2.961,00

1) Что ожидалось:

Первый «Дата + Shift + WSNo (Key1)» является уникальным, и оператор SQL должен вычислять «Total PTime» и / или «Total BDPlanned» для Key1.

Затем рассчитанные результаты на основе Key1 должны быть равномерно распределены по элементам на основе второго уникального «Date + Shift + WSNo + StokNo (Key2)».

(Примечание. Ожидаемые результаты должны быть сохранены в новой таблице, отличной от текущей таблицы)

2) Для достижения результатов я попробовал следующие утверждения:

а)

CREATE TABLE #myTable1
        (Date date,
        Shift varchar(2),
        WSNo varchar(25),
        WONo Float,
        StockNo float,
        PTime float);


INSERT INTO #myTable1
SELECT Date, Shift, WSNo, WONo, SUM(PTime) AS TPTime
    FROM myTable
    WHERE WONo = 3786
    GROUP BY Date, Shift, WSNo, WONo, CONCAT(Date,'+' , Shift,'+' ,WONo)



CREATE TABLE #myTable2
        (Date date,
        Shift varchar(2),
        WSNo varchar(25),
        WONo Float,
        StockNo float,
        PTime float);

INSERT INTO #myTable2
SELECT Date, Shift, WSNo, WONo, StockNo, SUM(PTime) AS TPTime
    FROM myTable
    WHERE WONo = 3786
    GROUP BY Date, Shift, WSNo, WONo, StockNo,


SELECT  StockNo
    ,[TPTime] = CASE T21.PTime
        WHEN (
                SELECT S22.PTime
                FROM  #myTable2 T22
                WHERE T22.StockNo = T21.StockNo
                )
            THEN (
                    SELECT SUM(PTime)
                    FROM #myTable1 S11
                    WHERE T21.StockNo = T11.StockNo
                    )


FROM #myTable2 T21

Сообщение об ошибке: Сообщение 512, Уровень 16, Состояние 1, Строка 1 Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

б) Когда я установил другой оператор с помощью «INNER JOIN», я получил нижеуказанную ошибку:

«Сообщение 4104, уровень 16, состояние 1, строка 2» Не удалось связать многокомпонентный идентификатор «T11.PTime».

в) Для другой попытки, установив «StockNo» в качестве переменной (@StockNo) и, таким образом, присвоить вычисленные значения переменной из каждой таблицы Temp; Я снова получил сообщение об ошибке

«Не удалось связать многоэлементный идентификатор«… ».

Я не уверен, если бы на этой платформе уже была решена та же проблема, но было бы очень признательно, если бы вы помогли мне разобраться с этим.

Большое спасибо заранее и очень-очень жаль за мою длинную почту.

С уважением

1 Ответ

0 голосов
/ 13 сентября 2018

Кажется, вам нужна оконная функция:

select Date, Shift, WSNo, WONo, StockNo, sum(PTime) over(), sum(BDPlanned) over()
from #myTable1 mt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...