Добавить два значения столбца, где дата совпадает? - PullRequest
0 голосов
/ 19 июня 2019

Я сформировал представление из нескольких таблиц. Это представление содержит, например, столбцы Номер заказа, Имя и Дата / время.

НА ПРИМЕРЕ

Оригинал:

| Order number  | Name      | Datetime                  |
|-------------: |--------   |-------------------------  |
|        -1094  | Bob       | 2019-04-02 12:58:56.000   |
|        -1989  | Anna      | 2018-03-27 09:13:53.000   |
|          -43  | Peter     | 2018-04-16 10:20:40.000   |
|        -1094  | Dieter    | 2017-12-30 11:28:23.000   |
|        -1094  | Sabi      | 2019-04-02 12:58:56.000   |

Я написал функцию, которая добавляет имена и возвращает их мне. Проблема в том, что для отображения результатов запроса требуется много времени. Около 1000 записей занимает около 1 часа. Это слишком медленно. Я надеюсь, что вы можете дать мне несколько советов о том, как улучшить функцию или совершенно другое решение.

USE [****]
GO
/****** Object:  UserDefinedFunction [dbo].[*_***_sfGetProjectName]    Script Date: 19.06.2019 14:03:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[*_***_sfGetProjectName](@starttime datetime) RETURNS VARCHAR(MAX)
BEGIN
    DECLARE tmpCursor CURSOR FOR SELECT Projektname FROM dbo.*_***_Sollzeit_Istzeit2 WHERE Startzeit = @starttime
    DECLARE @tmpProjectName VARCHAR(MAX)
    DECLARE @ReturnProjectName VARCHAR(MAX)
    DECLARE @tmpCursorRows INTEGER

    SET @tmpProjectName = ''
    SET @ReturnProjectName = ''
    SET @tmpCursorRows = 0

    OPEN tmpCursor
    SET @tmpCursorRows = @@CURSOR_ROWS
    FETCH NEXT FROM  tmpCursor INTO @tmpProjectName

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @tmpCursorRows > 1 
        BEGIN
            SET @ReturnProjectName = @ReturnProjectName + '_' + @tmpProjectName
        END
        ELSE
        BEGIN
            SET @ReturnProjectName = @tmpProjectName
        END

        FETCH NEXT FROM tmpCursor INTO @tmpProjectName
    END

    CLOSE tmpCursor
    DEALLOCATE tmpCursor

    RETURN @ReturnProjectName
END;

Я хочу добавить все имена, для которых значение столбца Datetime равно.

Результат:

| Order number  | Name      | Datetime                  |
|-------------: |---------- |-------------------------  |
|        -1094  | Bob_Sabi  | 2019-04-02 12:58:56.000   |
|        -1989  | Anna      | 2018-03-27 09:13:53.000   |
|          -43  | Peter     | 2018-04-16 10:20:40.000   |
|        -1094  | Dieter    | 2017-12-30 11:28:23.000   |

1 Ответ

0 голосов
/ 19 июня 2019

Если вы работаете с SQL Server 2017 или выше, используйте string_agg.Для более низких версий используйте комбинацию stuff и for xml:

Для SQL Server 2016 или ниже:

SELECT DISTINCT [Order number], 
       (
           STUFF(
           (
               SELECT '_' + Name
               FROM <YourViewNameHere> As T1
               WHERE T1.[Datetime] = T0.[Datetime]
               -- Unremark if you want the names to be sorted in the output
               -- ORDER BY Name 
               FOR XML PATH('')
           ), 1, 1, '')
       ) As Name      ,
       [Datetime]
FROM <YourViewNameHere> As T0

Для Sql Server 2017 или выше:

SELECT [Order number], STRING_AGG(Name, '_') As Name, [Datetime]
FROM <YourViewNameHere> 
GROUP BY [Order number], [Datetime]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...