added sum functions and fixed rounding

main
casey 2026-06-13 09:55:00 +10:00
parent 4c51ed6b9d
commit e10e5da9f2
9 changed files with 911 additions and 4 deletions

View File

@ -0,0 +1,6 @@
Product_Category,Min_Product_Cost,Max_Product_Cost
Art & Crafts,1.99,20.99
Electronics,6.99,20.99
Games,2.99,17.99
Sports & Outdoors,6.99,14.99
Toys,3.99,34.99
1 Product_Category Min_Product_Cost Max_Product_Cost
2 Art & Crafts 1.99 20.99
3 Electronics 6.99 20.99
4 Games 2.99 17.99
5 Sports & Outdoors 6.99 14.99
6 Toys 3.99 34.99

View File

@ -0,0 +1,6 @@
Product_Category,Min_Product_Cost,Max_Product_Cost
Art & Crafts,1.99,20.99
Electronics,6.99,20.99
Games,2.99,17.99
Sports & Outdoors,6.99,14.99
Toys,3.99,34.99
1 Product_Category Min_Product_Cost Max_Product_Cost
2 Art & Crafts 1.99 20.99
3 Electronics 6.99 20.99
4 Games 2.99 17.99
5 Sports & Outdoors 6.99 14.99
6 Toys 3.99 34.99

View File

@ -0,0 +1,6 @@
Product_Category,Count,Sum_Product_Cost
Art & Crafts,8,71.92
Electronics,3,42.97
Games,8,66.92
Sports & Outdoors,7,71.93
Toys,9,104.91
1 Product_Category Count Sum_Product_Cost
2 Art & Crafts 8 71.92
3 Electronics 3 42.97
4 Games 8 66.92
5 Sports & Outdoors 7 71.93
6 Toys 9 104.91

View File

@ -0,0 +1,6 @@
Product_Category,Last_Product_Cost,Last_Product_Name
Art & Crafts,20.99,PlayDoh Playset
Electronics,20.99,Toy Robot
Games,17.99,Rubik's Cube
Sports & Outdoors,14.99,Nerf Gun
Toys,34.99,Lego Bricks
1 Product_Category Last_Product_Cost Last_Product_Name
2 Art & Crafts 20.99 PlayDoh Playset
3 Electronics 20.99 Toy Robot
4 Games 17.99 Rubik's Cube
5 Sports & Outdoors 14.99 Nerf Gun
6 Toys 34.99 Lego Bricks

View File

@ -0,0 +1,422 @@
<?xml version="1.0"?>
<AlteryxDocument yxmdVer="2022.3">
<Nodes>
<Node ToolID="2">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileInput.DbFileInput">
<Position x="102" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<Passwords />
<File RecordLimit="" SearchSubDirs="False" FileFormat="0" OutputFileName="">Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv</File>
<FormatSpecificOptions>
<HeaderRow>True</HeaderRow>
<IgnoreErrors>False</IgnoreErrors>
<AllowShareWrite>False</AllowShareWrite>
<ImportLine>1</ImportLine>
<FieldLen>254</FieldLen>
<SingleThreadRead>False</SingleThreadRead>
<IgnoreQuotes>DoubleQuotes</IgnoreQuotes>
<Delimeter>,</Delimeter>
<QuoteRecordBreak>False</QuoteRecordBreak>
<CodePage>28591</CodePage>
</FormatSpecificOptions>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>products.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
<MetaInfo connection="Output">
<RecordInfo>
<Field name="Product_ID" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Name" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Category" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Cost" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Price" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
</RecordInfo>
</MetaInfo>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileInput" />
</Node>
<Node ToolID="3">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Category" action="Count" rename="Count" />
<SummarizeField field="Product_Cost" action="Sum" rename="Sum_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="4">
<GuiSettings Plugin="AlteryxBasePluginsGui.AlteryxSelect.AlteryxSelect">
<Position x="342" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<OrderChanged value="False" />
<CommaDecimal value="False" />
<SelectFields>
<SelectField field="Product_Cost" selected="True" type="Float" size="4" />
<SelectField field="Product_Price" selected="True" type="Float" size="4" />
<SelectField field="*Unknown" selected="True" />
</SelectFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSelect" />
</Node>
<Node ToolID="5">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">Z:\Pyteryx\Alteryx_TestWorkflows\TransformTesting\Output\expected\ProductCountSumCost.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCountSumCost.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="6">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="306" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Min" rename="Min_Product_Cost" />
<SummarizeField field="Product_Cost" action="Max" rename="Max_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="7">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="306" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">Z:\Pyteryx\Alteryx_TestWorkflows\TransformTesting\Output\expected\ProductCountMinMax.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCountMinMax.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="8">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Min" rename="Min_Product_Cost" />
<SummarizeField field="Product_Cost" action="Max" rename="Max_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="9">
<GuiSettings Plugin="AlteryxBasePluginsGui.Sort.Sort">
<Position x="438" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<SortInfo locale="1033">
<Field field="Product_Category" order="Ascending" />
<Field field="Product_Cost" order="Ascending" />
</SortInfo>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>Product_Category - Ascending
Product_Cost - Ascending</DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSort" />
</Node>
<Node ToolID="10">
<GuiSettings Plugin="AlteryxBasePluginsGui.Formula.Formula">
<Position x="234" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<FormulaFields>
<FormulaField expression="ReplaceChar([Product_Cost], &quot;$&quot;, &quot;&quot;)" field="Product_Cost" size="254" type="V_String" />
<FormulaField expression="ReplaceChar([Product_Price], &quot;$&quot;, &quot;&quot;)" field="Product_Price" size="254" type="V_String" />
</FormulaFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>Product_Cost = ReplaceChar([Product_Cost], "$", "")
Product_Price = ReplaceChar(...</DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxFormula" />
</Node>
<Node ToolID="11">
<GuiSettings Plugin="AlteryxBasePluginsGui.Formula.Formula">
<Position x="678" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<FormulaFields>
<FormulaField expression="Round([Sum_Product_Cost], 0.01)" field="Sum_Product_Cost" size="8" type="Double" />
</FormulaFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText><![CDATA[Sum_Product_Cost = Round([Sum_Product_Cost], 0.01)
]]></DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxFormula" />
</Node>
<Node ToolID="12">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="534" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Last" rename="Last_Product_Cost" />
<SummarizeField field="Product_Name" action="Last" rename="Last_Product_Name" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="13">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">Z:\Pyteryx\Alteryx_TestWorkflows\TransformTesting\Output\expected\ProductCostMinMax.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCostMinMax.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="14">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="534" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">Z:\Pyteryx\Alteryx_TestWorkflows\TransformTesting\Output\expected\ProductMostExpensive.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductMostExpensive.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
</Nodes>
<Connections>
<Connection>
<Origin ToolID="2" Connection="Output" />
<Destination ToolID="10" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="3" Connection="Output" />
<Destination ToolID="11" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="3" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="6" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="9" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="6" Connection="Output" />
<Destination ToolID="7" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="8" Connection="Output" />
<Destination ToolID="13" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="9" Connection="Output" />
<Destination ToolID="8" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="9" Connection="Output" />
<Destination ToolID="12" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="10" Connection="Output" />
<Destination ToolID="4" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="11" Connection="Output" />
<Destination ToolID="5" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="12" Connection="Output" />
<Destination ToolID="14" Connection="Input" />
</Connection>
</Connections>
<Properties>
<Memory default="True" />
<GlobalRecordLimit value="0" />
<TempFiles default="True" />
<Annotation on="True" includeToolName="False" />
<ConvErrorLimit value="10" />
<ConvErrorLimit_Stop value="False" />
<CancelOnError value="False" />
<DisableBrowse value="False" />
<EnablePerformanceProfiling value="False" />
<RunWithE2 value="True" />
<PredictiveToolsCodePage value="1252" />
<DisableAllOutput value="False" />
<ShowAllMacroMessages value="False" />
<ShowConnectionStatusIsOn value="True" />
<ShowConnectionStatusOnlyWhenRunning value="True" />
<ZoomLevel value="0" />
<LayoutType>Horizontal</LayoutType>
<MetaInfo>
<NameIsFileName value="True" />
<Name>SumToolTesting</Name>
<Description />
<RootToolName />
<ToolVersion />
<ToolInDb value="False" />
<CategoryName />
<SearchTags />
<Author />
<Company />
<Copyright />
<DescriptionLink actual="" displayed="" />
<Example>
<Description />
<File />
</Example>
<WorkflowId value="bd9c622e-55b5-45d9-b957-9f04f79ca6e4" />
<Telemetry>
<PreviousWorkflowId value="af561ec6-d0f5-46ba-a79a-ac40ca762cb9" />
<OriginWorkflowId value="af561ec6-d0f5-46ba-a79a-ac40ca762cb9" />
</Telemetry>
</MetaInfo>
<Events>
<Enabled value="True" />
</Events>
</Properties>
</AlteryxDocument>

View File

@ -0,0 +1,422 @@
<?xml version="1.0"?>
<AlteryxDocument yxmdVer="2022.3">
<Nodes>
<Node ToolID="2">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileInput.DbFileInput">
<Position x="102" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<Passwords />
<File RecordLimit="" SearchSubDirs="False" FileFormat="0" OutputFileName="">..\Maven Toys Data\products.csv</File>
<FormatSpecificOptions>
<HeaderRow>True</HeaderRow>
<IgnoreErrors>False</IgnoreErrors>
<AllowShareWrite>False</AllowShareWrite>
<ImportLine>1</ImportLine>
<FieldLen>254</FieldLen>
<SingleThreadRead>False</SingleThreadRead>
<IgnoreQuotes>DoubleQuotes</IgnoreQuotes>
<Delimeter>,</Delimeter>
<QuoteRecordBreak>False</QuoteRecordBreak>
<CodePage>28591</CodePage>
</FormatSpecificOptions>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>products.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
<MetaInfo connection="Output">
<RecordInfo>
<Field name="Product_ID" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Name" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Category" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Cost" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
<Field name="Product_Price" size="254" source="File: Z:\Pyteryx\Alteryx_TestWorkflows\Maven Toys Data\products.csv" type="V_String" />
</RecordInfo>
</MetaInfo>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileInput" />
</Node>
<Node ToolID="3">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Category" action="Count" rename="Count" />
<SummarizeField field="Product_Cost" action="Sum" rename="Sum_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="4">
<GuiSettings Plugin="AlteryxBasePluginsGui.AlteryxSelect.AlteryxSelect">
<Position x="342" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<OrderChanged value="False" />
<CommaDecimal value="False" />
<SelectFields>
<SelectField field="Product_Cost" selected="True" type="Float" size="4" />
<SelectField field="Product_Price" selected="True" type="Float" size="4" />
<SelectField field="*Unknown" selected="True" />
</SelectFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSelect" />
</Node>
<Node ToolID="5">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">.\Output\expected\ProductCountSumCost.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCountSumCost.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="6">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="306" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Min" rename="Min_Product_Cost" />
<SummarizeField field="Product_Cost" action="Max" rename="Max_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="7">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="306" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">.\Output\expected\ProductCountMinMax.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCountMinMax.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="8">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Min" rename="Min_Product_Cost" />
<SummarizeField field="Product_Cost" action="Max" rename="Max_Product_Cost" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="9">
<GuiSettings Plugin="AlteryxBasePluginsGui.Sort.Sort">
<Position x="438" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<SortInfo locale="1033">
<Field field="Product_Category" order="Ascending" />
<Field field="Product_Cost" order="Ascending" />
</SortInfo>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>Product_Category - Ascending
Product_Cost - Ascending</DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxSort" />
</Node>
<Node ToolID="10">
<GuiSettings Plugin="AlteryxBasePluginsGui.Formula.Formula">
<Position x="234" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<FormulaFields>
<FormulaField expression="ReplaceChar([Product_Cost], &quot;$&quot;, &quot;&quot;)" field="Product_Cost" size="254" type="V_String" />
<FormulaField expression="ReplaceChar([Product_Price], &quot;$&quot;, &quot;&quot;)" field="Product_Price" size="254" type="V_String" />
</FormulaFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>Product_Cost = ReplaceChar([Product_Cost], "$", "")
Product_Price = ReplaceChar(...</DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxFormula" />
</Node>
<Node ToolID="11">
<GuiSettings Plugin="AlteryxBasePluginsGui.Formula.Formula">
<Position x="678" y="162" />
</GuiSettings>
<Properties>
<Configuration>
<FormulaFields>
<FormulaField expression="Round([Sum_Product_Cost], 0.01)" field="Sum_Product_Cost" size="8" type="Double" />
</FormulaFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText><![CDATA[Sum_Product_Cost = Round([Sum_Product_Cost], 0.01)
]]></DefaultAnnotationText>
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxFormula" />
</Node>
<Node ToolID="12">
<GuiSettings Plugin="AlteryxSpatialPluginsGui.Summarize.Summarize">
<Position x="570" y="534" />
</GuiSettings>
<Properties>
<Configuration>
<SummarizeFields>
<SummarizeField field="Product_Category" action="GroupBy" rename="Product_Category" />
<SummarizeField field="Product_Cost" action="Last" rename="Last_Product_Cost" />
<SummarizeField field="Product_Name" action="Last" rename="Last_Product_Name" />
</SummarizeFields>
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText />
<Left value="False" />
</Annotation>
</Properties>
<EngineSettings EngineDll="AlteryxSpatialPluginsEngine.dll" EngineDllEntryPoint="AlteryxSummarize" />
</Node>
<Node ToolID="13">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="426" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">.\Output\expected\ProductCostMinMax.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductCostMinMax.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
<Node ToolID="14">
<GuiSettings Plugin="AlteryxBasePluginsGui.DbFileOutput.DbFileOutput">
<Position x="798" y="534" />
</GuiSettings>
<Properties>
<Configuration>
<File MaxRecords="" FileFormat="0">.\Output\expected\ProductMostExpensive.csv</File>
<Passwords />
<Disable>False</Disable>
<FormatSpecificOptions>
<LineEndStyle>CRLF</LineEndStyle>
<Delimeter>,</Delimeter>
<ForceQuotes>False</ForceQuotes>
<HeaderRow>True</HeaderRow>
<CodePage>28591</CodePage>
<WriteBOM>True</WriteBOM>
</FormatSpecificOptions>
<MultiFile value="False" />
</Configuration>
<Annotation DisplayMode="0">
<Name />
<DefaultAnnotationText>ProductMostExpensive.csv</DefaultAnnotationText>
<Left value="False" />
</Annotation>
<Dependencies>
<Implicit />
</Dependencies>
</Properties>
<EngineSettings EngineDll="AlteryxBasePluginsEngine.dll" EngineDllEntryPoint="AlteryxDbFileOutput" />
</Node>
</Nodes>
<Connections>
<Connection>
<Origin ToolID="2" Connection="Output" />
<Destination ToolID="10" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="3" Connection="Output" />
<Destination ToolID="11" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="3" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="6" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="4" Connection="Output" />
<Destination ToolID="9" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="6" Connection="Output" />
<Destination ToolID="7" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="8" Connection="Output" />
<Destination ToolID="13" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="9" Connection="Output" />
<Destination ToolID="8" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="9" Connection="Output" />
<Destination ToolID="12" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="10" Connection="Output" />
<Destination ToolID="4" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="11" Connection="Output" />
<Destination ToolID="5" Connection="Input" />
</Connection>
<Connection>
<Origin ToolID="12" Connection="Output" />
<Destination ToolID="14" Connection="Input" />
</Connection>
</Connections>
<Properties>
<Memory default="True" />
<GlobalRecordLimit value="0" />
<TempFiles default="True" />
<Annotation on="True" includeToolName="False" />
<ConvErrorLimit value="10" />
<ConvErrorLimit_Stop value="False" />
<CancelOnError value="False" />
<DisableBrowse value="False" />
<EnablePerformanceProfiling value="False" />
<RunWithE2 value="True" />
<PredictiveToolsCodePage value="1252" />
<DisableAllOutput value="False" />
<ShowAllMacroMessages value="False" />
<ShowConnectionStatusIsOn value="True" />
<ShowConnectionStatusOnlyWhenRunning value="True" />
<ZoomLevel value="0" />
<LayoutType>Horizontal</LayoutType>
<MetaInfo>
<NameIsFileName value="True" />
<Name>SumToolTesting</Name>
<Description />
<RootToolName />
<ToolVersion />
<ToolInDb value="False" />
<CategoryName />
<SearchTags />
<Author />
<Company />
<Copyright />
<DescriptionLink actual="" displayed="" />
<Example>
<Description />
<File />
</Example>
<WorkflowId value="bd9c622e-55b5-45d9-b957-9f04f79ca6e4" />
<Telemetry>
<PreviousWorkflowId value="af561ec6-d0f5-46ba-a79a-ac40ca762cb9" />
<OriginWorkflowId value="af561ec6-d0f5-46ba-a79a-ac40ca762cb9" />
</Telemetry>
</MetaInfo>
<Events>
<Enabled value="True" />
</Events>
</Properties>
</AlteryxDocument>

View File

@ -12,7 +12,7 @@ class TypeMapper:
"Int16": pl.Int16,
"Int32": pl.Int32,
"Int64": pl.Int64,
"Float": pl.Float32,
"Float": pl.Float64,
"Double": pl.Float64,
"String": pl.String,
"V_String": pl.String,
@ -31,7 +31,7 @@ class TypeMapper:
"Int16": "SMALLINT",
"Int32": "INTEGER",
"Int64": "BIGINT",
"Float": "FLOAT",
"Float": "DOUBLE",
"Double": "DOUBLE",
"String": "VARCHAR",
"V_String": "VARCHAR",

View File

@ -38,8 +38,8 @@ FUNCTION_MAP: dict[str, str] = {
"Ceil": "CEIL({0})",
"FLOOR": "FLOOR({0})",
"Floor": "FLOOR({0})",
"ROUND": "ROUND({0}, {1})",
"Round": "ROUND({0}, {1})",
"ROUND": None, # handled in get_function_sql
"Round": None, # handled in get_function_sql
"SQRT": "SQRT({0})",
"Sqrt": "SQRT({0})",
"POW": "POWER({0}, {1})",
@ -113,6 +113,12 @@ def get_function_sql(name: str, args: list[str]) -> str:
break
if template is None:
# Check for specially-handled functions
upper = name.upper()
if upper == "ROUND":
return _render_round(args)
if upper == "SWITCH":
return _render_switch(args)
# Unknown function — pass through as-is (may work in DuckDB natively)
args_joined = ", ".join(args)
return f"{name}({args_joined})"
@ -130,6 +136,25 @@ def get_function_sql(name: str, args: list[str]) -> str:
return f"{name}({args_joined})"
def _render_round(args: list[str]) -> str:
"""Alteryx Round(value, multiple).
Round(x, 0.01) round to 2 decimal places
Round(x, 1) round to 0 decimal places
Round(x, 100) round to nearest 100
Round(x) round to 0 decimal places
"""
if len(args) == 0:
return "NULL"
if len(args) == 1:
return f"ROUND({args[0]}, 0)"
# Second arg is the rounding multiple as a decimal literal.
# Convert to number of decimal places: n = -log10(multiple)
# e.g. 0.01 → 2, 1 → 0, 100 → -2
# Use CAST to INTEGER because DuckDB ROUND requires an int precision.
return f"ROUND({args[0]}, CAST(-LOG10({args[1]}) AS INTEGER))"
def _render_switch(args: list[str]) -> str:
"""Switch(val, default, v1, r1, v2, r2, ...) → CASE val WHEN v1 THEN r1 ... ELSE default END"""
if len(args) < 2:

View File

@ -37,12 +37,26 @@ class SummarizeTool(BaseTool):
return {"Output": df.select(group_fields).unique(maintain_order=True)}
return {"Output": pl.DataFrame()}
# Upcast Float32 columns to Float64 before aggregation to avoid
# floating-point precision noise (matches Alteryx behaviour).
float32_cols = [
c for c in df.columns
if df[c].dtype == pl.Float32
]
if float32_cols:
df = df.with_columns(
[pl.col(c).cast(pl.Float64) for c in float32_cols]
)
if group_fields:
result = df.group_by(group_fields, maintain_order=True).agg(agg_exprs)
# Restore group column order
all_cols = group_fields + [e.meta.output_name() for e in agg_exprs]
existing = [c for c in all_cols if c in result.columns]
result = result.select(existing)
# Sort by group columns for deterministic output
# (Alteryx Summarize sorts groups alphabetically)
result = result.sort(group_fields)
else:
result = df.select(agg_exprs)