SQL Server: обмен строк с столбцами - PullRequest
0 голосов
/ 01 февраля 2019

Мои образцы данных

Month Name    MaterialName                                Qty
August        M.Sand(Premium M sand concrete)             0.000
December      M.Sand(Premium M sand Plaster -THRIVENI)    24.950
January       M.Sand(Premium M sand concrete)             527.730
January       20MM                                        68.730
January       M.Sand(Premium M sand Plaster -THRIVENI)    333.040
January       12MM                                        41.480
January       6MM                                         135.000
January       GSB                                         78.300
January       TP SAND BAG                                 55.000
November      M.Sand(Premium M sand concrete)             45.000
October      20MM                                         30.000
September    M.Sand(Premium M sand concrete)              40.000

Ожидаемый результат:

Month Name | M.Sand(Premium M sand concrete) | M.Sand(Premium M sand Plaster -THRIVENI) | 20MM      
August     |         0.000           |      0.000               | 0.000
December   |         0.000           |      24.950              | 0.000
January    |         527.730             |      0.000               | 68.730

etc....

Пожалуйста, дайте подходящее решение для выше.У меня есть результат, как показано здесь на этом скриншоте:

enter image description here

Но мне нужны такие данные:

enter image description here

Мой запрос:

SELECT DATENAME(MONTH, TripDate) [Month Name],
       MM.MaterialName,
       ISNULL(SUM([NetWeight]), 0) Qty
FROM [TRANS].[tblWeighBridgeEntry] WB
LEFT JOIN MAS.tblMaterialMaster MM ON MM.MaterialID = WB.RefMaterialId
WHERE TripDate IS NOT NULL
  AND TripDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(M, -6, CURRENT_TIMESTAMP)), 0)
GROUP BY DATENAME(MONTH, TripDate),
         RefMaterialId,
         MaterialName

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы можете сделать что-то вроде этого:

SELECT 
    MonthName [Month Name]
,   SUM(CASE WHEN MaterialName = 'M.Sand(Premium M sand concrete)' THEN Qty ELSE 0 END) [M.Sand(Premium M sand concrete)]
,   SUM(CASE WHEN MaterialName = 'M.Sand(Premium M sand Plaster -THRIVENI)' THEN Qty ELSE 0 END) [M.Sand(Premium M sand Plaster-THRIVEN)]
,   SUM(CASE WHEN MaterialName = '20MM' THEN Qty ELSE 0 END) [20MM]
-- ......... etc 
FROM (
    SELECT  
        DATENAME(MONTH,TripDate) [MonthName]
    ,   MM.MaterialName
    ,   SUM([NetWeight]) Qty 
    FROM 
        [TRANS].[tblWeighBridgeEntry] WB
    LEFT JOIN MAS.tblMaterialMaster MM ON MM.MaterialID = WB.RefMaterialId
    WHERE 
        TripDate  >=  DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(M, -6, CURRENT_TIMESTAMP)), 0) 
    GROUP BY 
        DATENAME(MONTH, TripDate)
    ,   MaterialName 
) D 
GROUP BY 
    MonthName

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

0 голосов
/ 01 февраля 2019

Попробуйте это:

SELECT  DATENAME(MONTH,TripDate) [Month Name],MM.MaterialName, ISNULL(SUM([NetWeight]),0) Qty
INTO #DataSource
FROM [TRANS].[tblWeighBridgeEntry] WB
LEFT JOIN MAS.tblMaterialMaster MM ON MM.MaterialID = WB.RefMaterialId
WHERE TripDate IS NOT NULL AND  TripDate  >=  DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(M, -6, CURRENT_TIMESTAMP)), 0) 
GROUP BY DATENAME(MONTH, TripDate),RefMaterialId,MaterialName 


DECLARE @DynamicTSQLStatement NVARCHAR(MAX)
       ,@ColumnNames NVARCHAR(MAX);

SELECT @ColumnNames = STUFF
(
    (
        SELECT DISTINCT ',[' + MaterialName + ']'
        FROM #DataSource
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
   ,1
   ,1
   ,''
);

SET @DynamicTSQLStatement = N'
select ' + @ColumnNames + '
from ##DataSource
PIVOT 
(
    MAX([Qty]) FOR [key] IN (' + @ColumnNames + ')
) PVT
FOR JSON PATH;
';


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