WedX - журнал о программировании и компьютерных науках

Можно ли выбрать столбец из базы данных и не отображать его в наборе результатов - если он выбран, возникает проблема с группировкой по

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

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
From //Doing some joins here
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks

Набор результатов дает мне много записей, но группирует те, у которых одинаковые X, Y, Z, W - так что без группы по это будет выглядеть так

X                Y                 Z                  W
-----------------------------------------------------------
123              Anton             772                0
123              Anton             772                0

Очевидно, что с группой они свернуты в одно целое...

Проблема возникает, когда я пытаюсь включить дополнительный столбец в свой запрос Select. Мне нужен этот запрос в моем, потому что мне нужно значение в моем коде, чтобы иметь возможность различать, какой это тип записи. В новом столбце эти две строки данных не совпадают, поэтому они не объединяются.

Есть ли способ как-то добавить дополнительный столбец, но не отображать его, а исключить из Group By?

Это то, что я имею в виду

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
    'P' = tblC.Proc     -- New column
From //Doing some joins here
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks,
    tblC.Proc       -- New column

В этом случае данные выглядят так

X                Y                 Z                  W          P
---------------------------------------------------------------------
123              Anton             772                0          FPN
123              Anton             772                0          PPN

Итак, теперь, когда P отличается для двух записей, которые ранее были объединены в одну, есть ли способ каким-то образом не отображать P, но все же иметь возможность получить его значение из моего набора записей. Я не могу выбрать «P», если он не выбран в этом одном запросе, и из-за того, что две записи не сворачиваются, у меня возникают серьезные проблемы.

В основном мне нужно выбрать «P», но не включать его в мой набор результатов или группировать по.

Любая помощь приветствуется.


  • Если значения различны для каждой из строк, и вы все еще хотите, чтобы они были свернуты в одну строку, как процессор должен решить, какое из двух разных значений включить в свернутую строку? Нет, вы не можете сделать это в одном наборе результатов. вам нужно выполнить отдельный запрос для другого несвернутого набора результатов. Или, если вы хотите свернуть ТОЛЬКО P записей, просто добавьте предложение Where, которое сводит только P строк. 15.08.2017
  • Зачем GROUP BY, когда не используются агрегатные функции? Вы пытаетесь выполнить SELECT DISTINCT? 15.08.2017
  • Что мне нужно, чтобы выбрать «P», но не включать его в мой набор результатов? Как вы думаете, в чем разница между выбором чего-либо и включением этого в ваш набор результатов? Добавление желаемых результатов из примера данных может пролить свет. Если вы хотите получить значение из набора записей, какое значение вы бы хотели получить? 15.08.2017

Ответы:


1

Я думаю, есть несколько вариантов... На самом деле нет способа получить значения, не имея их в ваших результатах. Как бы вы еще их читали?

Можно было бы STUFF значения "P" в список с разделителями-запятыми, т.е.:

X                Y                 Z                  W          P
123              Anton             772                0          FPN,PPN

Затем прочитайте их в своем приложении через запятую. Читайте здесь: https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server

Другим было бы создание логических заголовков, если для «P» не слишком много вариантов или вы знаете все параметры. Вы можете создать их, используя операторы CASE, например:

,SUM(CASE WHEN tlbc.Proc = 'PPN' THEN 1 ELSE 0 END) AS "PPN"

РЕДАКТИРОВАТЬ: Опустить совокупность вокруг него, чтобы он правильно группировался. Также можно использовать MAX для 1 или 0... зависит от того, сколько результатов может быть для tlbc.Proc. Некоторая агрегатная функция вокруг ваших дел объединит ваши строки в одну.

Для таких результатов, как:

X                Y                 Z                  W          FPN          PPN          AnotherP
123              Anton             772                0          1          1          0

В-третьих, если я неправильно понял ваш вопрос и вам не нужны значения, а просто нужны в ГДЕ, то не отображайте их.

Есть определенно больше способов сделать это.

Это помогает?

15.08.2017
  • Спасибо за предложения 15.08.2017
  • @BobSki Нет проблем! Дайте мне знать, если какой-либо из них не работает для вашего конкретного случая, и мы можем попытаться придумать что-то еще. 15.08.2017

  • 2

    Вам нужно выполнить какую-то агрегатную функцию для P, чтобы вам не нужно было группировать ее. Если вам нужно только одно из значений, вы можете использовать MIN() или MAX(), чтобы получить одно из них.

    Итак, что-то вроде:

    SELECT X, Y, Z, MAX(P) AS P etc....
    

    Другим способом было бы использовать что-то вроде FOR XML PATH, чтобы свести значения к одному значению (возможно, список, разделенный запятыми). В сети есть много примеров того, как люди это делают. Вот один пример:

    https://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation

    15.08.2017
  • Спасибо за предложения 15.08.2017

  • 3

    Если вам нужна только одна запись на первые четыре столбца DISTINCT, какой из столбцов P вы хотите показать?

    Если у вас есть ответ на этот вопрос, просто добавьте к запросу

    Where tblC.Proc = -->YOUR_EXPECTED_VALUE_OR_CONDITION_HERE<--
    
    15.08.2017
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]