2015-06-30 17 views
5
I Tarife gibi her hafta için tek bir kullanıcı programı göstermek gerekir

,birden fazla kolon değerleri, burada maddesi

Senaryo: saatler için BBA, Matematik ve öğleden önce: bir öğretim tek bir hafta (Örneğin birden çok toplu atanır 1 ve 2) & (MBA, Matematik, öğleden evvel bir aynı tarihte Hour 3 & 4) söylemek (GRIDVIEW ait 30-06-2015) .Ben satır vb 2 olarak mağaza gibi 1 olarak ve 2 satır saklar .. .......

Benim Tablo Tanımı:

CREATE TABLE [dbo].[test] (
    [datedif]  NVARCHAR (50) NOT NULL, 
    [hour]   INT    NULL, 
    [subject] NVARCHAR (MAX) NULL, 
    [faculty] NVARCHAR (MAX) NULL, 
    [attendence] BIT   NULL, 
    [dayweek]  NVARCHAR (50) NULL, 
    [weekmonth] NVARCHAR (MAX) NULL, 
    [batch]  NVARCHAR (MAX) NULL, 
    [section]  NVARCHAR (MAX) NULL, 
    [session]  NVARCHAR (MAX) NULL 
); 
Datefdiff | hour | subject | faulty| batch 
----------+-------+----------+---------+-------+----------+--------+-------+----------+---------+------- 
30-06-2015| 1| Maths | Kevin | BBA 
30-06-2015| 2| Science | Amal | MBA 
30-06-2015|3 | chemistry|Jaya  |BBA 
30-06-2015|4 | chemistry|Jaya  |BBA 
30-06-2015|5 | chemistry|Jaya  |BBA 
31-06-2015 |1| science | Amal |BBA 
31-06-2015 |2| Maths | kevin |BBA 
31-06-2015 |3| Science | Amal |BBA 
31-06-2015 |4 | chemistry|Jaya  |BBA 
31-06-2015 |5| science | Amal |BBA 

Beklenen Çıktı sadece Fakültesi için verilecek:Tablo gibi görünüyor Amal

Datefdiff |hour|subject| batch |hour|subject | batch |faculty|hour | subject | batch | hour | subject | batch| hour | subject | batch | 
----------+-------+----------+-------+-------+----------+-------+-------+----------+ 
30-06-2015| 1 | Maths| BBA| 2| Science | MBA | 3| Science | BBA| 4| chemistry| BBA | 5 |Physics |MBA 
31-06-2015| 1 | Maths| BBA| 2| Science | MBA | 3| Science | BBA| 4| chemistry| BBA | 5 |Physics |MBA 

enter image description here

+6

. Bazı görüntü/formları taklit etmek için verileri depolamamalısınız. Veriler, örneğin, ör. "Konu" verileri * aynı * sütununda biter.Ardından, 1-5 numaralarını saklayabilen ve bu sütunun hangi verileri temsil ettiğini açıklayan fazladan bir sütun ekleyin (şu anda tabloya gömdüğünüz veriler * meta veriler * yanlışlıkla) –

+0

öneri, Hala bir yan tümce kullanarak yardımcı programın ayrıntılarını göstermek için alabilirseniz yine de yardımcı olacaktır, bu arada ben önerdiğiniz gibi Tablo tanımı değiştirmeye çalışacağız. – Prhem

+1

Tablo tanımını değiştirirken, tarih değerlerinin tarih veri türlerinde saklanacağını ve nvarchar'ın (max) uzun ve uzun unicode dizeleri için olduğunu unutmayın. Dizeleriniz hem kısa hem de düz İngilizce olarak göründüğünden, varchar (50) veya ihtiyaçlarınızı karşılayacak başka bir uzunluk kullanabilirsiniz. Ayrıca, verilerinizi normalleştirmenizi öneririm - konular için bir tablo, toplu bir tablo, hatalı ve benzeri bir tablo var. –

cevap

1

Bu tablo tasarımı için bir başlangıç ​​noktası olabilir:

declare @tbFaculty table (
     FacultyID int --identity(1,1) primary key 
    , Name varchar(50) 
) 

insert into @tbFaculty (FacultyID, Name) 
values (1, 'Kevin') 
     , (2, 'Amal') 

declare @tbBatch table(
     BatchID int --identity(1,1) primary key 
    , Name char(3) 
) 

insert into @tbBatch (BatchID, Name) 
values (1, 'BBA') 
     , (2, 'MBA') 

declare @tbClass table (
     [Hour] tinyint 
    , [Subject] nvarchar (128) 
    , [FacultyID] int 
    , [Attendence] bit 
    , [BatchID] char(3) 
    , [ClassDate] date 
) 

insert into @tbClass ([Hour], [Subject], FacultyID, Attendence, BatchID, ClassDate) 
values (1, 'Maths', 1, 1, 1, '2015-06-30') 
     , (2, 'Maths', 1, 1, 1, '2015-06-30') 
     , (3, 'Science', 2, 1, 1, '2015-06-30') 
     , (1, 'Science', 2, 1, 2, '2015-06-30') 
     , (2, 'Science', 2, 1, 2, '2015-06-30') 
     , (3, 'Maths', 1, 1, 2, '2015-06-30') 

select 
    cl.ClassDate 
    , cl.[Hour] 
    , cl.[Subject] 
    , ba.Name as BatchName 
    , fa.Name as FacultyName 
from 
    @tbClass cl 
    inner join @tbBatch ba on ba.BatchID = cl.BatchID 
    inner join @tbFaculty fa on fa.FacultyID = cl.FacultyID 
where 
    fa.Name = 'Amal' 

Konuyu da normalleştirebilirsiniz.

0

Burada FAZLA basit sorgulama yapacak verilerinizi normalleştirmek için nasıl.

tablo tanımını kullanarak,

INSERT INTO test(Datedif,hour1,subject1,faculty1,hour2,subject2,faculty2,hour3,subject3,faculty3,batch) 
VALUES ('30-06-2015',1,'Maths','Kevin',1,'Maths','Kevin',1,'Science','Amal','BBA'), 
     ('30-06-2015',1,'Science','Amal',1,'Science','Amal',1,'Maths','Kevin','MBA'); 

Sonra dar veri türleri ile verileriniz için yeni bir normalize yapı oluşturdu veri takılı. Verilerinizi temiz tutmanın yanı sıra depolama alanı boşa harcamamanıza yardımcı olur, bu yüzden çok fazla veri işlemek zorunda kalmadan sorgulamalar daha hızlı olacaktır.

CREATE TABLE new_test 
(
    dt   DATE   NULL, 
    hr   TINYINT   NULL, --holds values between 0 to 255 
    subj  VARCHAR(100) NULL, --plenty big enough. No need for NVARCHAR unless you are using Unicode characters 
    faculty  VARCHAR(100) NULL, 
    attendance BIT    NULL, 
    dayweek  TINYINT   NULL, 
    weekmonth TINYINT   NULL, 
    section  VARCHAR(100) NULL, --not sure what this is 
    sess  VARCHAR(100) NULL, --not sure what this is 
    batch  CHAR(3)   NULL --looks like there are three character codes 
); 

Verilerinizi normalleştirdiğim yer burası. Eğer varlığınız2,3,4 vb. Olduğundan emin değilim ... Eğer gerçek tablonuzda yaparsanız, kodumu düzeltmelisiniz.

Not: Bugünden itibaren hafta içi ve hafta içi günleri hesaplıyorum. En iyi tahminimi yaptım, eğer yanlışsa, onları düzeltmekten çekinmeyin! Şimdi

WITH norm_data 
AS 
(
SELECT datedif,hour1,subject1,faculty1,attendence1,dayweek,weekmonth,section,[session],batch FROM test 
UNION ALL 
SELECT datedif,hour2,subject2,faculty2,attendence1,dayweek,weekmonth,section,[session],batch FROM test 
UNION ALL 
SELECT datedif,hour3,subject3,faculty3,attendence1,dayweek,weekmonth,section,[session],batch FROM test 
UNION ALL 
SELECT datedif,hour4,subject4,faculty4,attendence1,dayweek,weekmonth,section,[session],batch FROM test 
UNION ALL 
SELECT datedif,hour5,subject5,faculty5,attendence1,dayweek,weekmonth,section,[session],batch FROM test 
) 

INSERT INTO new_test 
SELECT PARSE(datedif AS DATE USING 'de-DE') AS [datedif], 
     hour1, 
     subject1, 
     faculty1, 
     attendence1, 
     DATEPART(WEEKDAY,PARSE(datedif AS DATE USING 'de-DE')) AS dayweek, 
     datepart(day, datediff(day, 0, PARSE(datedif AS DATE USING 'de-DE'))/7 * 7)/7 + 1 AS weekmonth, 
     section, 
     [session], 
     batch 
FROM norm_data 

Doğru ise en yeni tabloya

SELECT * 
FROM new_test 

bakalım, o zaman burada sadece bu asa ayrı cevap eklemek için gidiyorum

EXEC SP_rename @objname = 'test', --if you don't want to drop the old table 
       @newname = 'test_old' 

EXEC SP_rename @objname = 'new_test', --now give the new table the actual name 
       @newname = 'test' 


SELECT * 
FROM test 
+0

Tabloyu önerinize göre değiştirdim.Yukarıdaki değiştirilmiş tabloyu görebiliyorsunuz.Onlarıma katılabilir ve ızgara görünümünde gösterebilirim.Lütfen bana bir fikrinizi önerin. Bkz. – Prhem

1

tabloları yeniden adlandırmak için . Bu deneyin: Kötü bir tablo tasarımını var

--INSERT INTO dbo.test(datedif,[hour],[subject],faculty,batch) 
--VALUES 
--('30-06-2015',1,'Maths','Kevin','BBA'), 
--('30-06-2015',2,'Science','Amal','MBA'), 
--('30-06-2015',3,'chemistry','Jaya','BBA'), 
--('30-06-2015',4,'chemistry','Jaya','BBA'), 
--('30-06-2015',5,'chemistry','Jaya','BBA'), 
--('31-06-2015',1,'science','Amal','BBA'), 
--('31-06-2015',2,'Maths','kevin','BBA'), 
--('31-06-2015',3,'Science','Amal','BBA'), 
--('31-06-2015',4,'chemistry','Jaya','BBA'), 
--('31-06-2015',5,'science','Amal','BBA'); 

WITH CTE_Hours 
AS 
(
    SELECT 
      1 AS hour1, 
      MAX(CASE WHEN [Hour] = 1 THEN [subject] END) AS subject1, 
      MAX(CASE WHEN [Hour] = 1 THEN [batch] END)  AS batch1 , 

      2 AS hour2, 
      MAX(CASE WHEN [Hour] = 2 THEN [subject] END) AS subject2, 
      MAX(CASE WHEN [Hour] = 2 THEN [batch] END)  AS batch2 

      --etc... 
    FROM dbo.test 
    WHERE faculty = 'Amal' 
) 

SELECT * 
FROM (
      SELECT DISTINCT datedif 
      FROM dbo.test 
     ) A 
CROSS JOIN CTE_Hours