簡體   English   中英

MS ACCESS組查詢

[英]MS ACCESS Group Query

這真的讓我撓頭。 有點像GROUP_CONCAT,但是有所不同。 我很確定沒有辦法僅使用SQL來做到這一點。 我有一個查詢,對規范化表執行翻轉表。 結果看起來像這樣:

|_Category_|_FieldA_|_FieldB_|_FieldC_|
|----------|--------|--------|--------|
|   CAT1   |    A   |        |        | 
|----------|--------|--------|--------|
|   CAT1   |        |    B   |        | 
|----------|--------|--------|--------|
|   CAT1   |        |        |    C   | 
|----------|--------|--------|--------|
|   CAT1   |   D    |        |        | 
|----------|--------|--------|--------|
|   CAT1   |        |        |    E   |   
|----------|--------|--------|--------|
|   CAT1   |    F   |        |        | 
|----------|--------|--------|--------|

我的挑戰是將其壓縮為盡可能少的行,但每個單元格只有一個值。

|_Category_|_FieldA_|_FieldB_|_FieldC_|
|----------|--------|--------|--------|
|   CAT1   |    A   |    B   |    C   | 
|----------|--------|--------|--------|
|   CAT1   |    D   |        |    E   | 
|----------|--------|--------|--------|
|   CAT1   |    F   |        |        | 
|----------|--------|--------|--------|

有任何想法嗎?

提前致謝。

標記

正如我在對該問題的評論中提到的,標准化表應如下所示:

|_Category_|_F_Name_|_F_Val__|
|----------|--------|--------|
|   CAT1   | FieldA |    A   |
|----------|--------|--------|
|   CAT1   | FieldB |    B   |
|----------|--------|--------|
|   CAT1   | FieldC |    C   |
|----------|--------|--------|
|   CAT1   | FieldB |    D   |
|----------|--------|--------|
|   CAT1   | FieldC |    E   |
|----------|--------|--------|
|   CAT1   | FieldA |    F   |
|----------|--------|--------|

如何實現呢?

SELECT A.Category, "FieldA" AS FieldName, A.FieldA AS FieldValue
FROM TableA AS A
WHERE NOT A.FieldA IS NULL
UNION ALL
SELECT A.Category, "FieldB", A.FieldB
FROM TableA AS A
WHERE NOT A.FieldB IS NULL
UNION ALL
SELECT A.Category, "FieldC", A.FieldC
FROM TableA AS A
WHERE NOT A.FieldC IS NULL;

要將數據導出到新表中,請使用查詢:

SELECT B.* INTO TableB
FROM (
   --above query
)  AS B;

不要忘記將自動編號字段(作為主鍵)添加到TableB以能夠識別每條記錄。

根據我的理解,您想透視數據。 這不是那么簡單,因為我們需要模擬

ROW_NUMBER() OVER(PARTITION BY FieldName, ORDER BY ID)

MS Access不支持。 如何解決呢?

SELECT B.ID, B.Category, B.FieldName, B.FieldValue,
       (SELECT COUNT(A.FieldName)
        FROM TableB AS A
        WHERE A.FieldName=B.FieldName AND A.ID >=B.ID
        GROUP BY A.FieldName ) AS TRank
FROM TableB AS B;

它應產生以下記錄集:

ID  Category    FieldName   FieldValue  TRank
1   CAT1        FieldA      A           3
2   CAT1        FieldA      D           2
3   CAT1        FieldA      F           1
4   CAT1        FieldB      B           1
5   CAT1        FieldC      C           2
6   CAT1        FieldC      E           1

但是...您不能將以上查詢用作數據透視表的源,因為出現“ Microsoft Access數據庫引擎無法識別為有效的字段名稱或表達式。(錯誤3070) ”錯誤消息。 因此,最后,您應該將這些數據導出到另一個表中(假設為TableC )。

SELECT C.* INSERT INTO TableC
FROM TableB AS C

現在,您可以透視數據:

TRANSFORM First(A.FieldValue) AS FirstOfFieldValue
SELECT A.Category, A.TRank
FROM TableC AS A
GROUP BY A.Category, A.TRank
PIVOT A.FieldName;

結果:

Category    TRank   FieldA  FieldB  FieldC
CAT1        1       F       B       E
CAT1        2       D       C
CAT1        3       A       

干杯,
Maciej

我有同樣的問題。 看一下: Microsoft Access壓縮表中的多行

或在此處獲取雲版本https://www.apponfly.com/en/application/microsoft-access-2013

效果很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM