Nano Hash - криптовалюты, майнинг, программирование

Курсор SQL в динамическом содержимом

Мне нужна небольшая помощь, чтобы разобраться с CURSOR.

Я сделал отчет aspx, это было довольно просто. Для каждого проекта мне нужно было увидеть, сколько часов ушло на исследования, разработки и внутренние дела. Тот первый был довольно простым, я просто жестко запрограммировал решение с 3 группами и равными 3 типами времени. Босс подумал, что это блестящий отчет, поэтому он хотел, чтобы он охватил всех клиентов. К сожалению, у следующего клиента было 5 групп, и у каждой группы было 2-7 разных типов времени для каждой.

Теперь мне нужно динамическое решение, в котором я могу указать группы (сделано) и указать, какие типы времени входят в каждую группу (сделано), наконец, мне нужно объединить эти два с таблицей, в которой записаны потраченные часы.

У меня есть базовый курсор, где я могу перечислить проекты, тип времени и сколько времени было потрачено в рамках этой группы времени.

У меня есть:
Проект A -|- Группа A -|- 5
Проект B -|- Группа A -|- 2
Проект C -|- Группа A -|- 10

Проект A -|- Группа B -|- 1
Проект B -|- Группа B -|- 10
Проект C -|- Группа B -|- 2

Проект A -|- Группа C -|- 0
Проект B -|- Группа C -|- 3
Проект C -|- Группа C -|- 7

Проблема в том, что мне нужно, чтобы отчет был
Заголовок____Группа A|Группа B|Группа C|Группа N
Проект A -|- 5 -|- 1 -|- 0 -|- x
Проект B - |- 2 -|- 10 -|- 3 -|- y
Проект C -|- 10 -|- 2 -|- 7 -|- z

DECLARE @iTimeTypeGroupID int

DECLARE cur CURSOR LOCAL READ_ONLY
FOR 
SELECT iRefTimeTypeGroupID
FROM tbl_TimeTypeGrouping
WHERE iRefCustomerID = @customerID

OPEN cur

FETCH NEXT FROM cur
INTO @iTimeTypeGroupID

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT PT.iRefProjectID
        , PT.iRefTimeTypeID
        , SUM(PT.decNumberOfHours) sumNumberOfHours
    FROM tbl_ProjectTransaction PT
    WHERE iRefTimeTypeID IN (
        SELECT iRefTimeTypeID 
        FROM tbl_TimeTypeGrouping 
        WHERE iRefTimeTypeGroupID = @iTimeTypeGroupID
            AND iRefCustomerID = @customerID)
    GROUP BY PT.iRefProjectID
        , PT.iRefTimeTypeID

    FETCH NEXT FROM cur
    INTO @iTimeTypeGroupID
END

CLOSE cur
DEALLOCATE cur

  • Какую версию sql-сервера вы используете? Какой столбец является названием группы, а какой столбец — названием проекта? 21.01.2013
  • Разработка — 2008 год, Live — 2005 год. Имя проекта — sProjectName (после того, как я присоединился к tbl_Project). То же самое с группой sGroupName (после того, как я присоединюсь к ней). 21.01.2013
  • еще один пример динамической сводки, пожалуйста, добавьте схемы таблиц 21.01.2013
  • Под схемами таблиц вы имеете в виду, что все они являются dbo или различными задействованными таблицами? 21.01.2013
  • Да, нам нужна схема таблицы, чтобы мы могли помочь вам больше. Посмотрите на ответ 21.01.2013

Ответы:


1

Я не уверен в именах столбцов. Итак, в этом примере я ожидаю, что tbl_ProjectTransaction будет иметь столбец с именем projectName, а tbl_TimeTypeGrouping будет иметь GroupName. Как и кто-то, кто ответил на вопрос, вы не должны использовать курсор в этом случае. Вы должны использовать динамический свод. Вот и пример:

Получите имена групп следующим образом:

DECLARE @cols VARCHAR(MAX)
SELECT @cols=STUFF
(
    (
        SELECT 
            ',' +QUOTENAME(tbl_TimeTypeGrouping.sGroupName) -- ????
        FROM
            tbl_TimeTypeGrouping
        FOR XML PATH('')
    )
,1,1,'')

Это даст вам:

'[Group A],[Group B],[Group C],[Group N]'

А затем выполните динамический поворот следующим образом:

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        tbl_ProjectTransaction.sProjectName, -- ????
        tbl_ProjectTransaction.decNumberOfHours,
        tbl_TimeTypeGrouping.sGroupName -- ???
    FROM
        tbl_ProjectTransaction
        JOIN tbl_TimeTypeGrouping
            ON tbl_ProjectTransaction.iRefTimeTypeID=tbl_TimeTypeGrouping.iRefTimeTypeID
) AS SourceTable
PIVOT
(
    SUM(decNumberOfHours)
    FOR GroupName IN ('+@cols+')
) As Pvt'
EXECUTE(@query)

Использованная литература:

21.01.2013
  • Спасибо, посмотрю. 21.01.2013
  • @DoStuffZ: Нет проблем. Рад был вам помочь ;-) 21.01.2013
  • И снова ты спасаешь мою шкуру. 29.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..