Вывод динамического столбца запроса SQL Server select

Если вы хотите, чтобы новые столбцы показывали год и месяц отдельно, вы можете сделать это:

df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

или ...

df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month

Затем вы можете комбинировать их или работать с они такие же, как и они.

2
задан Mark Baijens 17 January 2019 в 08:02
поделиться

3 ответа

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

Следовательно, лучшее, что вы сможете сделать, - это выполнить три отдельных шага:

  1. Выполнить запрос, чтобы рассказать о столбцах, которые вы хотите использовать. [110 ]
  2. Используйте результаты # 1 для составления нового запроса на лету.
  3. Выполните новый запрос и верните результаты.

Даже в этом случае этот тип сводки обычно лучше обрабатывается в вашем клиентском коде или инструменте отчетов. Единственной хорошей новостью является то, что все еще возможно выполнить все это на большинстве платформ с помощью одной длинной строки SQL.

Для этой конкретной ситуации, когда вы четко просматриваете номера недель, вы можете обойти проблему, предполагая, что все 53 возможных недели вперед (не 52, из-за частичных недель в конце года!), И написание большого оператора SQL, который вручную учитывает все 55 столбцов (53 недели + статья и описание).

0
ответ дан Joel Coehoorn 17 January 2019 в 08:02
поделиться

Вы можете попробовать следующий запрос, используя Pivot для достижения желаемого результата.

Create Table Article (ArticleId Int, [Description] Varchar(10))
Insert Into Article Values (1, 'Test')

Create Table OrderForecast(ArticleId Int, [Week] Int, [Order] Int, Amount Int)
Insert Into OrderForecast Values (1, 51, 1, 0),(1, 52, 2, 150), (1, 1, 3, 0),(1, 2, 4, 200), (1, 3, 5,0)

Select ArticleId, [Description], Week51, Week52, Week1, Week2, Week3
from
(
  select ArticleId, [Description], Amount, [Week]
  from 
    (
    SELECT OrderForecast.ArticleId, 'Week' + Convert(Varchar(10), OrderForecast.[Week]) as [Week], [Order], Amount, 
        Article.[Description] as [Description] FROM OrderForecast
    Inner Join Article On OrderForecast.ArticleId = Article.ArticleId
    )a
) d
pivot
(
  max(Amount)
  for [Week] in (Week51, Week52, Week1, Week2, Week3)
) piv;

Результат будет таким, как показано ниже

ArticleId   Description Week51  Week52  Week1   Week2   Week3
-------------------------------------------------------------
1           Test        0       150     0       200     0

Здесь я использовал запрос в качестве таблицы, потому что неделя была в числах, таких как 1, 2, но вы хотите, чтобы результат был на неделе1, неделе2 и т.д. Итак, я связал слово Week в числе и использовал его в запросе Pivot.

Вы можете найти живое демо Live Demo Здесь

0
ответ дан Suraj Kumar 17 January 2019 в 08:02
поделиться

При условии, что номера НЕДЕЛИ и номера Порядка совпадают, поддерживать последовательность столбцов не так уж и сложно.

Вы можете заметить, что я использовал #forecast и #article, потому что я не знал ваших реальных имен таблиц.

Пример

Declare @SQL varchar(max) = '
Select *
 From (
        Select A.ArticleID
              ,D.Description 
              ,B.*
         From  #forecast  A
         Join  #article   D on A.ArticleID=D.ArticleID
         Cross Apply (values (''Week''+left(Week,4),Amount) ) B(Item,Value)
      ) A
 Pivot (max([Value]) 
        For [Item] in (' + Stuff((Select ','+QuoteName('Week'+left(Week,4)) 
                                   From (Select Distinct top 100 [Order],Week From #forecast Order by [Order]  ) A  
                                   For XML Path('')),1,1,'') + ') ) p'
Exec(@SQL);
--Print @SQL

Возвращает

ArticleID   Description Week51  Week52  Week1   Week2   Week3
1           Test        0       150     0       200     0
0
ответ дан John Cappelletti 17 January 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: