2017-09-04 19 views
0

我有一個包含n個列的票詳細信息表。每個項目都有一個特定的配置來選擇特定數量的列來查找相同價值票的重複計數。目前,我有一個具有固定列名稱的表格,爲所有項目保存和保存頻率值。用於動態場景的SQL表設計

表1:票務詳細

TicketID | Column1 | Column2 | Column3 | Column4 |ProjectN  
T1  | Priority1| Low  | M1  | S1  |XYZ 
T2  | Priority1| Low  | M1  | S1  |XYZ 
T3  | Priority1| High | M1  | S1  |XYZ 
T4  | Priority1| Low  | M1  | S1  |ABC 
T5  | Priority1| Low  | M1  | S1  |ABC 

表2固定列:

ID | Column1 | Column2 | Column3 | Column4 |ProjectN | Frequency 
1 | Priority1| Low  | M1  | S1  |XYZ  |2 
2 | Priority1| High | M1  | S1  |XYZ  |1 
3 | Priority1| Low  | M1  | S1  |ABC  |2 

現在,我需要實現與具有不同的列數相同的值存儲邏輯爲每個項目 對於例如:如果項目1選擇第1列,第2列,第3列,則結果表應該具有這3列值和票數

類似地,ne xt項目可以選擇column1,column3,如果是這樣,那麼對於這個項目,應該跟蹤這些值並計數。 需要動態地在單個sql server表中實現此邏輯,其中包含所選列的值和來自故障單詳細信息表的重複計數。 請幫助如何使用sql表建立邏輯。

+0

究竟是什麼問題?你有沒有試過動態SQL? – Serg

回答

0

更改您的結構是

表1:TicketTypes

TicketTypeID | Column1 | Column2 | Column3 | Column4 
1   | Priority1| Low  | M1  | S1 
2   | Priority1| High | M1  | S1 

表2:門票

TicketID | TicketTypeID |ProjectN  
T1  | 1   |XYZ 
T2  | 1   |XYZ 
T3  | 2   |XYZ 
T4  | 1   |ABC 
T5  | 1   |ABC 

然後,你將填補與由所使用的列的獨特組合TicketTypes項目(在嘗試插入票據表之前進行檢查)。您還需要決定是否表示該列不適用或將其設置爲NULL。

然後加入此票類型表與您的票證詳細信息,以確定它屬於哪種類型。 (如果你將列設置爲空,那麼你需要在你的連接中做一個ISNULL()以加入這些值)。

然後,例如,你可以有這個在你的票種表:

TicketTypeID | Column1 | Column2 | Column3 | Column4 
1   | Priority1| Low  | M1  | S1 
2   | Priority1| High | M1  | S1 
3   | Priority1| NULL | M1  | NULL 
4   | NULL  | High | NULL | S1 
5   | NULL  | NULL | NULL | NULL 

現在你需要的表實際存在給你看的頻率是多少?或者這只是爲了報告目的?否則,你多久更新一次表格?你可能會用一個視圖或存儲過程是這樣更好:

SELECT 
    tType.Column1 
    , tType.Column2 
    , tType.Column3 
    , tType.Column4 
    , tickets.ProjectN 
    , COUNT(1) AS Frequency 
FROM TicketTypes AS tTypes 
JOIN Tickets 
    ON tickets.TicketTypeID = tTypes.TicketTypeID 
GROUP BY tType.Column1, tType.Column2, tType.Column3, tType.Column4, tickets.ProjectN 
+0

是的,表格應該有頻率欄來知道重複票的數量。 – DhivyaBharathi

+0

是的,這個問題是重複票的數量會改變,所以你需要不斷更新表來反映這一點。你可能會更好地製作一個視圖或存儲過程來產生你的最終表,這樣當你查詢它時,它總是會提供最新的信息 – PreQL

0

動態SQL的方式是這樣的:

declare @sql nvarchar(max); 
set @sql = N'select '+ @columns + N', ProjectN, count(*) Frequency from [Table 1] group by '+ @columns + N', ProjectN'; 
exec sp_sqlexec @sql; 

@columns就像N'column1, column2, column3'輸入字符串,您可以在存儲使用程序。