SQL превращает строки в столбцы - PullRequest
1 голос
/ 09 ноября 2011

Я не совсем уверен, возможно ли то, что мне нужно.У меня есть две таблицы, которые объединены, одна из которых представляет собой список элементов, а другая - когда произошло перемещение этих элементов в указанную дату.Движения задаются сумматорами, в этом примере 1 = закуплено, 2 = продано, 3 = скорректировано.Пока кодирование, которое у меня есть, дает отдельную строку для каждого сумматора.Мне нужно объединить строки в одну для каждого элемента.

SELECT [Totalizer]=COALESCE(t2.[F1034],0)
      ,[UPC]=t1.[F01]
      ,[QTY]=sum(coalesce(t2.[F64],0))
      ,[Total Amount]=sum(COALESCE(t2.[F65],0))
FROM [STORESQL].[dbo].[COST_TAB] t1
LEFT OUTER JOIN [STORESQL].[dbo].[RPT_ITM_D] t2 
ON t1.F01=t2.F01 AND (F254='2011-10-1') and (F1034=1 or F1034=2 or F1034=3)
group by t1.F01,F1034
order by t1.F01

Таблица COST_TAB состоит из:

UPC
1
2
3
4

RPT_ITM_D Состоит из движения элемента:

UPC     Date       Totalizer     QTY     Total Amount
1       2011-10-1  1             1       9.00
1       2011-10-1  2             1       9.99
2       2011-10-1  1             2       6.00
2       2011-10-1  2             1       3.99
2       2011-10-1  3             1       3.00
3       2011-10-1  1             1       1.00

Код SQL, который у меня сейчас есть, приводит к:

UPC     Date       Totalizer     QTY     Total Amount
1       2011-10-1  1             1       9.00
1       2011-10-1  2             1       9.99
2       2011-10-1  1             2       6.00
2       2011-10-1  2             1       3.99
2       2011-10-1  3             1       3.00
3       2011-10-1  1             1       1.00
4       2011-10-1  0             0       0.00

Мне нужно, чтобы он привел к:

UPC     Date       Purchased  AMT   Sold  AMT    Adjusted  AMT
1       2011-10-1  1          9.00  1     9.99   0         0.00
2       2011-10-1  2          6.00  1     3.99   1         3.00
3       2011-10-1  1          1.00  0     0.00   0         0.00
4       2011-10-1  0          0.00  0     0.00   0         0.00

Я понимаю, что мне, вероятно, придется полностью переработать мои столбцы, ноЯ не знаю, с чего начать, и могу ли я вообще это сделать.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Предполагая, что вы находитесь на MS SQL Server, вы можете использовать PIVOT для достижения этой цели - для объяснения и некоторых примеров см. http://msdn.microsoft.com/en-us/library/ms177410.aspx и http://www.simple -talk.com / community / blogs / andras /archive / 2007/09/14 / 37265.aspx

Другой вариант - использовать подвыборы:

SELECT
T1.F01 AS UPC,
T2.F254 AS TheDate,
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 1 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS PURCHASED,
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 1 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_P,
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 2 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS SOLD,
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 2 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_S,
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 3 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS ADJUSTED,
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 3 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_A
FROM [STORESQL].[dbo].[COST_TAB] t1
LEFT OUTER JOIN [STORESQL].[dbo].[RPT_ITM_D] t2 
ON t1.F01=t2.F01 AND (F254='2011-10-1') and (F1034=1 or F1034=2 or F1034=3)
group by T1.F01, T2.F254
ORDER BY T1.F01, T2.F254

Вы должны сравнить оба варианта в отношении плана производительности / исполнения.

1 голос
/ 09 ноября 2011

В вашем пространстве имен / базы данных схемы вы найдете определение вашей таблицы.Точная таблица, в которой хранятся определения таблиц, зависит от того, какую СУБД вы используете.Например, information_schema.COLUMNS будет хранить эту информацию для вас в MYSQL, и вы можете ВЫБРАТЬ ее оттуда, как и в любой другой таблице, и скрестить эти возвращаемые значения в соединении с вашей таблицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...