问题
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