2016-11-18 34 views
0

我搜索了一下,發現了很多類似的東西,但並不完全符合我的要求。MS Access(通過VB.NET) - 將鏈接的屬性錶轉換爲輸出中的列

我有什麼本質上是一堆帶有屬性和值的鏈接表。

xxBio table 

xxBio_ID xxBio_LINK 
1   100 
2   101 



xx table 

xxBio_LINK xxAttr_LINK 
100   1000 
101   2000 



xxAttr table 

xxAttr_LINK xxAttrCat_1_LINK xxAttrCat_2_LINK 
1000  null    550 
2000  650     null 



xxAttrCat_1 table 

xxAttrCat_1_LINK xxAttrCat_1_Description  xxAttrCat_1_Value 
650     wumpus      20 


xxAttrCat_2 table 

xxAttrCat_2_LINK xxAttrCat_2_Description  xxAttrCat_2_Value 
550     frith      30 

輸出要求是:

xxBio_ID frith wumpus 
1   30  null 
2   null 20 

我可以很容易地看到如何得到的結果與像attribute_name1,attribute_value1,attribute_name2,attribute_value2等欄目設置。

SELECT xxBio.ID, xxAttrCat_1.xxAttrCat_1_Description, xxAttrCat_1.xxAttrCat_1_Value, xxAttrCat_2.xxAttrCat_2_Description, xxAttrCat_2.xxAttrCat_2_Value 

FROM ((

(xx INNER JOIN xxBio ON xx.xxBio_LINK = xxBio.xxBio_LINK) 

INNER JOIN xxAttr ON xx.xxAttr_LINK = xxAttr.xxAttr_LINK) 

LEFT JOIN xxAttrCat_1 ON xxAttr.xxAttrCat_1_LINK = xxAttrCat_1.xxAttrCat_1_LINK) 
LEFT JOIN xxAttrCat_2 ON xxAttr.xxAttrCat_2_LINK = xxAttrCat_2.xxAttrCat_2_LINK 

但這不是我們所需要的。我們需要屬性名稱作爲列名。

我們如何實現這一目標?

更新質疑: 原來,我們誤解了要求,所以我們不得不採取了不同的路線,並沒有得到嘗試的答案。我很感激幫助。

回答

0

將SQL放入字符串中並從VBA執行。 (?動態SQL)

sql = "SELECT xxBio.ID, " & xxAttrCat_1.xxAttrCat_1_Description & ", " & ... 
+0

剛想過這個。上面這個可以用來創建你的表,但是隨後的傳遞將會被要求把這些記錄寫到這個表中,就像你的例子一樣。 – geeFlo

0

考慮使用IIF()條件語句:

SELECT xxBio.ID,  
     IIF(xxAttrCat_1.xxAttrCat_1_Description = 'wumpus', 
      xxAttrCat_1.xxAttrCat_1_Value, NULL) As [wumpus], 
     IIF(xxAttrCat_2.xxAttrCat_2_Description = 'frith', 
      xxAttrCat_2.xxAttrCat_2_Value, NULL) As [frith]  
FROM (((xx 
INNER JOIN xxBio ON xx.xxBio_LINK = xxBio.xxBio_LINK) 
INNER JOIN xxAttr ON xx.xxAttr_LINK = xxAttr.xxAttr_LINK) 
LEFT JOIN xxAttrCat_1 ON xxAttr.xxAttrCat_1_LINK = xxAttrCat_1.xxAttrCat_1_LINK) 
LEFT JOIN xxAttrCat_2 ON xxAttr.xxAttrCat_2_LINK = xxAttrCat_2.xxAttrCat_2_LINK 

如果每個ID都可以沿着相同的描述多個值,你需要總結或平均所有相應的值,然後將查詢轉換爲條件聚合(稱爲透視)。爲了簡潔和組織,下面還使用表別名a,b,c1,c2

SELECT b.ID,  
     SUM(IIF(c1.xxAttrCat_1_Description='wumpus', c1.xxAttrCat_1_Value, NULL)) As [wumpus], 
     SUM(IIF(c2.xxAttrCat_2_Description='frith', c2.xxAttrCat_2_Value, NULL)) As [frith]  
FROM (((xx 
INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK) 
INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK) 
LEFT JOIN xxAttrCat_1 c1 ON a.xxAttrCat_1_LINK = c1.xxAttrCat_1_LINK) 
LEFT JOIN xxAttrCat_2 c2 ON a.xxAttrCat_2_LINK = c2.xxAttrCat_2_LINK 
GROUP BY b.ID 

如果這樣的描述可以多次使用MS Access SQL的crosstab查詢。但是由於您有兩個類別,請在每個類別上運行一個交叉表並將它們保存爲已存儲的查詢或視圖。然後,聯合起來:

--CATEGORY 1 
TRANSFORM SUM(c1.xxAttrCat_1_Value) AS SumOfValue 
SELECT b.ID,      
FROM ((xx 
INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK) 
INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK) 
LEFT JOIN xxAttrCat_1 c1 ON a.xxAttrCat_1_LINK = c1.xxAttrCat_1_LINK 
GROUP BY b.ID 
PIVOT c1.xxAttrCat_1_Description; 

--CATEGORY 2 
TRANSFORM SUM(c2.xxAttrCat_2_Value) AS SumOfValue 
SELECT b.ID,      
FROM ((xx 
INNER JOIN xxBio b ON xx.xxBio_LINK = b.xxBio_LINK) 
INNER JOIN xxAttr a ON xx.xxAttr_LINK = a.xxAttr_LINK) 
LEFT JOIN xxAttrCat_2 c2 ON a.xxAttrCat_2_LINK = c2.xxAttrCat_2_LINK 
GROUP BY b.ID 
PIVOT c2.xxAttrCat_2_Description; 

--CROSSTAB QUERIES JOIN 
SELECT c1.*, c2.* 
FROM Categ1CrossTabQ c1 
INNER JOIN Categ1CrossTabQ c2 
ON c1.ID = c2.ID; 

請注意:以上雙破折號註釋在Access查詢中不允許的,只有一個語句被允許在保存的查詢。每個表/查詢的訪問限制爲255列,因此,除非使用IN子句,否則大於255的透視值將錯誤出現。最後,你不能使用交叉表作爲子查詢。而交叉表完全是MS Access命令,並未在其他DBMS中使用。