Tôi đã dành một vài ngày làm việc về điều này và đang đi vòng vòng.Cú pháp SQL để Xoay nhiều bảng
Câu hỏi của tôi là dựa trên câu trả lời tôi chấp nhận trong bài viết này: stackoverflow question
bây giờ tôi đã chuyển dữ liệu của tôi từ một bảng 400 cột duy nhất để một cấu trúc cơ sở dữ liệu nhiều dễ quản lý hơn với nhiều nhờ Damir Sudarevic.
cơ sở dữ liệu của tôi trông như thế này:
CREATE TABLE JobFiles (
JobID UNIQUEIDENTIFIER PRIMARY KEY,
MachineID UNIQUEIDENTIFIER REFERENCES Machines(MachineID),
[Desc] NVARCHAR(MAX),
Name NVARCHAR(255),
JobOpen BIT,
[CreateDate] DATETIME NOT NULL DEFAULT GETDATE(),
[ModifyDate] DATETIME NOT NULL DEFAULT GETDATE(),
[CreatedByUser] NVARCHAR(64) DEFAULT '',
[ModifiedByUser] NVARCHAR(64) DEFAULT '')
GO
CREATE TABLE JobParamType (
ParamTypeID UNIQUEIDENTIFIER PRIMARY KEY,
Name NVARCHAR(255),
[Desc] NVARCHAR(MAX),
IsTrait NVARCHAR)
GO
CREATE TABLE JobParamGroup (
ParamGroupID UNIQUEIDENTIFIER PRIMARY KEY,
Name NVARCHAR(255),
[Desc] NVARCHAR(MAX))
GO
CREATE TABLE JobParams (
ParamID UNIQUEIDENTIFIER PRIMARY KEY,
ParamTypeID UNIQUEIDENTIFIER REFERENCES JobParamType(ParamTypeID),
ParamGroupID UNIQUEIDENTIFIER REFERENCES JobParamGroup(ParamGroupID),
JobFileID UNIQUEIDENTIFIER REFERENCES JobFiles(JobID),
IsEnabled BIT)
GO
-- Text based property
CREATE TABLE JobTrait (
ParamID UNIQUEIDENTIFIER PRIMARY KEY REFERENCES JobParams(ParamID),
Value NVARCHAR(MAX))
GO
-- Numeric based property
CREATE TABLE JobMeasurement (
ParamID UNIQUEIDENTIFIER PRIMARY KEY REFERENCES JobParams(ParamID),
Value FLOAT,
Format NVARCHAR(20),
Unit NVARCHAR(MAX))
GO
Tuy nhiên, đối với một chức năng cụ thể của ứng dụng của tôi, tôi cần phải liệt kê tất cả các hàng JobParamType.Name như cột chứa một JobMeasurement.Value hoặc JobTrait. Giá trị như dữ liệu của nó cho mỗi JobFiles.Name.
JobParamType.IsTrait được sử dụng để xác định xem giá trị có phải là Đo lường hoặc Trait hay không.
tức
JobName | ParamName1 | ParamName2 | ParamName3 ... | ParamName400
"MyJob" MesurementValue TraitValue MesurementValue ... TraitValue
"TestJob" MesurementValue TraitValue MesurementValue ... TraitValue
"Job2" MesurementValue TraitValue MesurementValue ... TraitValue
etc
Tôi đã được chơi với các bảng pivoting và đã quản lý để có được các cột từ bảng JobParamType bằng cách nhìn vào các ví dụ và sau đó nhưng nó bây giờ là nhận được khá phức tạp bởi vì dữ liệu của tôi được chia giữa một số bảng và nó đang bắt đầu làm cho đầu của tôi bị tổn thương !!!
DECLARE @cols NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT DISTINCT TOP 10 PERCENT
'],[' + tParams.Name
FROM dbo.JobParamType AS tParams
ORDER BY '],[' + tParams.Name
FOR XML PATH('')
), 1, 2, '') + ']'
print @cols
Tôi hy vọng ai đó có thể giúp tôi với việc xoay vòng và nhận dữ liệu từ nhiều bảng.
Tôi hy vọng điều này có ý nghĩa và tôi mong được sự giúp đỡ và thảo luận của bạn.
Cảm ơn bạn đã nâng cao.
Cảm ơn bạn ... thời gian và nỗ lực của bạn được đánh giá rất cao. Bit phức tạp hơn tôi đầu tiên mặc dù nhiệm vụ này sẽ được như vậy sẽ được sàng lọc thông qua ví dụ của bạn ngày hôm nay và sẽ phá vỡ nó thành các bước. – Belliez
Damir, một thiên tài của bạn, cảm ơn bạn. Điều đó hoạt động hoàn hảo. Chỉ một câu hỏi cuối cùng. Làm thế nào tôi sẽ chạy lệnh này như bạn có ở trên. Bước 5 "SELECT txt FROM @qw" hiển thị lệnh trong một bảng (thông qua SQL Management Studio) và tôi phải sao chép và dán nó vào một truy vấn mới. Một lần nữa, cảm ơn bạn – Belliez
Ý tưởng là "đóng gói" truy vấn cuối cùng vào chế độ xem, thủ tục hoặc biến - tùy thuộc vào tần suất danh sách các thông số của bạn có thể thay đổi. Nếu 400 tham số đó thay đổi vài lần trong một năm, hãy sử dụng chế độ xem và tạo các thay đổi theo cách thủ công. Nếu họ thay đổi hàng ngày, hãy đặt biến này thành biến và thực thi như sql động - cũng tự động thực hiện bước 3 và 4. –