Я принимаю вещи проще с VFP. Однако, говоря datagridview, я бы предположил, что вы имели в виду C #, и это также может быть сделано в C # разными способами. С SQL вы также можете использовать «PIVOT». то есть:
DECLARE @table TABLE([MACHINE] VARCHAR(1), [WEEK] VARCHAR(7), [HOURS] INT, [PIECES] INT);
INSERT INTO @table(MACHINE, WEEK, HOURS, PIECES)
VALUES('A', '2018-12', 1, 2),
('B', '2018-12', 3, 4),
('A', '2018-13', 12, 1),
('B', '2018-13', 2, 5),
('A', '2018-15', 6, 6),
('B', '2018-15', 2, 2),
('C', '2018-16', 2, 1),
('D', '2018-17', 4, 22),
('B', '2018-17', 3, 9),
('A', '2018-18', 1, 8),
('E', '2018-18', 4, 4),
('D', '2018-13', 2, 4);
SELECT *
FROM(
SELECT MACHINE, WEEK, STR(HOURS, 4)+'H'+STR(PIECES, 3)+'P' AS data
FROM @table
) AS source
PIVOT(
MAX(data)
FOR WEEK IN([2018-12], [2018-13], [2018-14], [2018-15], [2018-16], [2018-17], [2018-18])
) AS mypivot;
Однако вам не хотелось бы жестко кодировать все эти столбцы в SQL. Проверьте на «динамический PIVOT». Вот пример из данных Northwind:
DECLARE @COUNTRY NVARCHAR(MAX) = '' , @cTotal NVARCHAR(MAX) = ''
SELECT @COUNTRY = @COUNTRY + COALESCE(QUOTENAME(Country) + ', ', '')
FROM Customers
WHERE EXISTS ( SELECT *
FROM [Orders] AS [o]
WHERE o.[CustomerID] = Customers.[CustomerID] )
GROUP BY Country;
SET @COUNTRY = LEFT(@COUNTRY, LEN(@COUNTRY) - 1);
SELECT @cTotal = @cTotal + COALESCE('Coalesce('+QUOTENAME(Country) + ',0) +', '')
FROM Customers
WHERE EXISTS ( SELECT *
FROM [Orders] AS [o]
WHERE o.[CustomerID] = Customers.[CustomerID] )
GROUP BY Country;
SET @cTotal = LEFT(@cTotal, LEN(@cTotal) - 1);
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'SELECT * , ' + @cTotal + ' AS TOTAL FROM
(
SELECT oe.EmployeeID, oe.LastName, oe.ShipCountry AS CO,
OD.Quantity * OD.UnitPrice AS QU
FROM (
SELECT EmployeeID, LastName, ShipCountry
FROM (
SELECT DISTINCT
ShipCountry
FROM Orders
) o ,
Employees
) oe
LEFT JOIN Orders O ON O.EmployeeID = oe.EmployeeID AND
[oe].[ShipCountry] = [O].[ShipCountry]
LEFT JOIN [Order Details] OD ON OD.OrderID = O.OrderID
) AS T
PIVOT(SUM(QU) FOR CO IN (' + @COUNTRY + ')) AS PVT
ORDER BY 1';
EXEC(@SQL);