Cross Tab Query with Records Going Horizontally | MS Access

风流意气都作罢 提交于 2020-07-23 07:35:29

问题


Essentially I have created a cross tab query, but I need some help presenting more of the records horizontally.

I have reviewed some of the pointers from the following post to progress forward, but still need some help, I would really appreciate a bit more help to get this final part correct.

How can I Create a Multi-Value CrossTab Query in Access 2013?

I currently have a table with the following data:

Using the following Query I was able to get all the colours to display horizontally with no issue:

TRANSFORM First(ColourNames.AssignedColour) AS whatever
SELECT ColourNames.ProductID
FROM (SELECT t1.ProductID, t1.[AssignedColour], "Colour" & Format(COUNT(*),"000") AS ColourName FROM ProductColor AS t1 INNER JOIN ProductColor AS t2 ON (t1.[AssignedColour]>=t2.[AssignedColour]) AND (t1.ProductID = t2.ProductID) GROUP BY t1.ProductID, t1.[AssignedColour])  AS ColourNames
GROUP BY ColourNames.ProductID
PIVOT ColourNames.ColourName;

Result:

But I am having some trouble understanding how I can also list the ColorFinding Horizontally after each AssignedColour for each ProductID like this:



2nd Attempt:

CrossTab Query 1:

TRANSFORM First(ColourNames.AssignedColour) AS whatever
SELECT ColourNames.ProductID
FROM (SELECT t1.ProductID, t1.[AssignedColour], "Colour" & Format(COUNT(*),"000") AS ColourName FROM ProductColor AS t1 INNER JOIN ProductColor AS t2 ON (t1.[AssignedColour]>=t2.[AssignedColour]) AND (t1.ProductID = t2.ProductID) GROUP BY t1.ProductID, t1.[AssignedColour])  AS ColourNames
GROUP BY ColourNames.ProductID
PIVOT ColourNames.ColourName;

CrossTab Query 2:

TRANSFORM First(ColourNames.ColourFinding) AS whatever
SELECT ColourNames.ProductID
FROM (SELECT t1.ProductID, t1.[ColourFinding], "Colour" & Format(COUNT(*),"000_Finding") AS ColourName FROM ProductColor AS t1 INNER JOIN ProductColor AS t2 ON (t1.[ColourFinding]>=t2.[ColourFinding]) AND (t1.ProductID = t2.ProductID) GROUP BY t1.ProductID, t1.[ColourFinding])  AS ColourNames
GROUP BY ColourNames.ProductID
PIVOT ColourNames.ColourName;

How can I now combine the results of the 2 to get the needed result?



Update 2:

I am getting incorrect results using the Nested Subquery Approach:

SELECT t1.ProductID, t1.[AssignedColour] AS Data, "Colour" & Format(COUNT(*),"000") AS Cnt
FROM ProductColor AS t1 INNER JOIN ProductColor AS t2 ON (t1.ProductID = t2.ProductID) AND (t1.[AssignedColour]>=t2.[AssignedColour])
GROUP BY T1.ProductID, T1.AssignedColour
UNION SELECT t1.ProductID, t1.[ColourFinding], "Colour" & Format(COUNT(*),"000") & "_Finding"
FROM ProductColor AS t1 INNER JOIN ProductColor AS t2 ON (t1.ProductID = t2.ProductID) AND (t1.[ColourFinding]>=t2.[ColourFinding])
GROUP BY T1.ProductID, T1.ColourFinding;

If following is my data:

My Expected Result is:

Using the Nested Sub Query I get the following:


回答1:


Couple techniques described in referenced links:
http://allenbrowne.com/ser-67.html#MultipleValues
How can I Create a Multi-Value CrossTab Query in Access 2013?

Join your two CROSSTAB queries to Products - master table of unique product records. Pull fields into query in whatever order you want.

SELECT Products.ProductID, ProductName, Colour001, Colour002, Colour003, Colour001_Finding, Colour002_Finding, Colour003_Finding
FROM Query2 RIGHT JOIN (Query1 RIGHT JOIN Products ON Query1.ProductID = Products.ProductID) ON Query2.ProductID = Products.ProductID;

That does limit to 3 sets of data. So use wildcard to pull in fields but then cannot specify order. SELECT Products.ProductID, ProductName, Query1.*, Query2.* ...

Another approach involves a UNION query that would then be used in CROSSSTAB. This is quite likely the slowest performance approach.

Query1: DataUNION

SELECT ID, ProductID, AssignedColour AS D, "Assigned" AS Cat, "Colour" & DCount("*","ProductColor","ProductID='" & ProductID & "' AND ID<" & ID)+1 AS GrpSeq FROM ProductColor
UNION SELECT ID, ProductID, ColourFinding, "Finding", "Colour" & DCount("*","ProductColor","ProductID='" & ProductID & "' AND ID<" & ID)+1 & "_Finding" FROM ProductColor;

Query2:

TRANSFORM First(DataUNION.D) AS FirstOfD
SELECT DataUNION.ProductID
FROM DataUNION
GROUP BY DataUNION.ProductID
PIVOT DataUNION.GrpSeq;

Here is what I have for UNION with nested queries to generate row numbering. Unfortunately, CROSSTAB doesn't like it. So, final suggestion is to write these records to a temp table and use that table as source for CROSSTAB.

SELECT ProductID, [AssignedColour] AS Data, (SELECT "Colour" & Format(COUNT(*)+1,"000")
FROM ProductColor AS T1 WHERE ProductColor.ProductID = T1.ProductID AND ProductColor.[ID]>T1.[ID]) AS GrpSeq
FROM ProductColor
UNION SELECT ProductID, [ColourFinding] AS Data, (SELECT "Colour" & Format(COUNT(*)+1,"000_Finding")
FROM ProductColor AS T1 WHERE ProductColor.ProductID = T1.ProductID AND ProductColor.[ID]>T1.[ID]) AS GrpSeq
FROM ProductColor;

VBA code like:

CurrentDb.Execute "DELETE FROM ProductColorTEMP"
CurrentDb.Execute "INSERT INTO ProductColorTEMP SELECT * FROM DataUNION"


来源:https://stackoverflow.com/questions/62615443/cross-tab-query-with-records-going-horizontally-ms-access

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!