| 1 | #include "catch.hpp" | 
|---|
| 2 | #include "test_helpers.hpp" | 
|---|
| 3 |  | 
|---|
| 4 | using namespace duckdb; | 
|---|
| 5 | using namespace std; | 
|---|
| 6 |  | 
|---|
| 7 | TEST_CASE( "SQL Server functions tests", "[sqlserver]") { | 
|---|
| 8 | unique_ptr<QueryResult> result; | 
|---|
| 9 | DuckDB db(nullptr); | 
|---|
| 10 | Connection con(db); | 
|---|
| 11 |  | 
|---|
| 12 | REQUIRE_NO_FAIL(con.Query( "CREATE SCHEMA Sales;")); | 
|---|
| 13 |  | 
|---|
| 14 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 15 | "CREATE TABLE Sales.SalesPerson( BusinessEntityID int NOT NULL, TerritoryID int, SalesQuota decimal(22,4), " | 
|---|
| 16 | "Bonus decimal(22,4) NOT NULL, CommissionPct decimal(10,4) NOT NULL, SalesYTD decimal(22,4) NOT NULL, " | 
|---|
| 17 | "SalesLastYear decimal(22,4) NOT NULL , rowguid string , ModifiedDate datetime NOT NULL );")); | 
|---|
| 18 | REQUIRE_NO_FAIL(con.Query( "COPY Sales.SalesPerson FROM 'test/sqlserver/data/SalesPerson.csv.gz' DELIMITER '\t';")); | 
|---|
| 19 |  | 
|---|
| 20 | REQUIRE_NO_FAIL(con.Query( "	CREATE TABLE Sales.SalesTaxRate( SalesTaxRateID int NOT NULL, StateProvinceID int NOT " | 
|---|
| 21 | "NULL, TaxType tinyint NOT NULL, TaxRate decimal(10,4) NOT NULL , Name string NOT NULL, " | 
|---|
| 22 | "rowguid string , ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 23 | REQUIRE_NO_FAIL( | 
|---|
| 24 | con.Query( "COPY Sales.SalesTaxRate FROM 'test/sqlserver/data/SalesTaxRate.csv.gz' DELIMITER '\t';")); | 
|---|
| 25 |  | 
|---|
| 26 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 27 | "CREATE TABLE Sales.SalesPersonQuotaHistory( BusinessEntityID int NOT NULL, QuotaDate datetime NOT NULL, " | 
|---|
| 28 | "SalesQuota decimal(22,4) NOT NULL, rowguid string , ModifiedDate datetime NOT NULL);")); | 
|---|
| 29 | REQUIRE_NO_FAIL(con.Query( "COPY Sales.SalesPersonQuotaHistory FROM " | 
|---|
| 30 | "'test/sqlserver/data/SalesPersonQuotaHistory.csv.gz' DELIMITER '\t';")); | 
|---|
| 31 |  | 
|---|
| 32 | REQUIRE_NO_FAIL( | 
|---|
| 33 | con.Query( "CREATE TABLE Sales.SalesTerritory( TerritoryID int NOT NULL, Name string NOT NULL, " | 
|---|
| 34 | "CountryRegionCode string NOT NULL, Group_ string NOT NULL, SalesYTD decimal(22,4) NOT NULL , " | 
|---|
| 35 | "SalesLastYear decimal(22,4) NOT NULL , CostYTD decimal(22,4) NOT NULL , CostLastYear decimal(22,4) " | 
|---|
| 36 | "NOT NULL , rowguid string , ModifiedDate datetime NOT NULL );")); | 
|---|
| 37 | REQUIRE_NO_FAIL( | 
|---|
| 38 | con.Query( "COPY Sales.SalesTerritory FROM 'test/sqlserver/data/SalesTerritory.csv.gz' DELIMITER '\t';")); | 
|---|
| 39 |  | 
|---|
| 40 | REQUIRE_NO_FAIL(con.Query( "CREATE SCHEMA HumanResources;")); | 
|---|
| 41 |  | 
|---|
| 42 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 43 | "CREATE TABLE HumanResources.Employee( BusinessEntityID int NOT NULL, NationalIDNumber string NOT NULL, " | 
|---|
| 44 | "LoginID string NOT NULL, OrganizationNode VARCHAR, 	OrganizationLevel integer not null, JobTitle string " | 
|---|
| 45 | "NOT NULL, BirthDate date NOT NULL, MaritalStatus string NOT NULL, Gender string NOT NULL, HireDate date NOT " | 
|---|
| 46 | "NULL, SalariedFlag string NOT NULL , VacationHours smallint NOT NULL , SickLeaveHours smallint NOT NULL, " | 
|---|
| 47 | "CurrentFlag string NOT NULL , rowguid string , ModifiedDate datetime NOT NULL); ")); | 
|---|
| 48 | REQUIRE_NO_FAIL( | 
|---|
| 49 | con.Query( "COPY HumanResources.Employee FROM 'test/sqlserver/data/Employee.csv.gz' DELIMITER '\t';")); | 
|---|
| 50 |  | 
|---|
| 51 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 52 | "CREATE TABLE HumanResources.EmployeePayHistory( BusinessEntityID int NOT NULL, RateChangeDate datetime NOT " | 
|---|
| 53 | "NULL, Rate decimal(22,4) NOT NULL, PayFrequency tinyint NOT NULL, ModifiedDate datetime NOT NULL); ")); | 
|---|
| 54 | REQUIRE_NO_FAIL(con.Query( "COPY HumanResources.EmployeePayHistory FROM " | 
|---|
| 55 | "'test/sqlserver/data/EmployeePayHistory.csv.gz' DELIMITER '\t';")); | 
|---|
| 56 |  | 
|---|
| 57 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE HumanResources.EmployeeDepartmentHistory( BusinessEntityID int NOT NULL, " | 
|---|
| 58 | "DepartmentID smallint NOT NULL, ShiftID tinyint NOT NULL, StartDate date NOT NULL, " | 
|---|
| 59 | "EndDate date, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 60 | REQUIRE_NO_FAIL(con.Query( "COPY HumanResources.EmployeeDepartmentHistory FROM " | 
|---|
| 61 | "'test/sqlserver/data/EmployeeDepartmentHistory.csv.gz' DELIMITER '\t';")); | 
|---|
| 62 |  | 
|---|
| 63 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE HumanResources.Department( DepartmentID smallint NOT NULL, Name string NOT " | 
|---|
| 64 | "NULL, GroupName string NOT NULL, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 65 | REQUIRE_NO_FAIL( | 
|---|
| 66 | con.Query( "COPY HumanResources.Department FROM 'test/sqlserver/data/Department.csv.gz' DELIMITER '\t';")); | 
|---|
| 67 |  | 
|---|
| 68 | REQUIRE_NO_FAIL( | 
|---|
| 69 | con.Query( "CREATE TABLE HumanResources.Shift( ShiftID tinyint NOT NULL, Name string NOT NULL, StartTime string " | 
|---|
| 70 | "NOT NULL, EndTime string NOT NULL, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 71 | REQUIRE_NO_FAIL(con.Query( "COPY HumanResources.Shift FROM 'test/sqlserver/data/Shift.csv.gz' DELIMITER '\t';")); | 
|---|
| 72 |  | 
|---|
| 73 | REQUIRE_NO_FAIL(con.Query( "CREATE SCHEMA Person;")); | 
|---|
| 74 |  | 
|---|
| 75 | REQUIRE_NO_FAIL( | 
|---|
| 76 | con.Query( "CREATE TABLE Person.Person( BusinessEntityID int NOT NULL, PersonType string NOT NULL, NameStyle " | 
|---|
| 77 | "string NOT NULL, Title string , FirstName string NOT NULL, MiddleName string, LastName string NOT " | 
|---|
| 78 | "NULL, Suffix string, EmailPromotion int NOT NULL, AdditionalContactInfo string, Demographics " | 
|---|
| 79 | "string, rowguid string, ModifiedDate datetime NOT NULL); ")); | 
|---|
| 80 | REQUIRE_NO_FAIL( | 
|---|
| 81 | con.Query( "COPY Person.Person FROM 'test/sqlserver/data/Person.csv.gz' (DELIMITER '|', QUOTE '*');")); | 
|---|
| 82 |  | 
|---|
| 83 | REQUIRE_NO_FAIL( | 
|---|
| 84 | con.Query( "CREATE TABLE Person.BusinessEntityAddress( BusinessEntityID int NOT NULL, AddressID int NOT NULL, " | 
|---|
| 85 | "AddressTypeID int NOT NULL, rowguid string, ModifiedDate datetime NOT NULL ) ; ")); | 
|---|
| 86 | REQUIRE_NO_FAIL(con.Query( "COPY Person.BusinessEntityAddress FROM " | 
|---|
| 87 | "'test/sqlserver/data/BusinessEntityAddress.csv.gz' DELIMITER '|';")); | 
|---|
| 88 |  | 
|---|
| 89 | REQUIRE_NO_FAIL( | 
|---|
| 90 | con.Query( "CREATE TABLE Person.Address( AddressID int NOT NULL, AddressLine1 string NOT NULL, AddressLine2 " | 
|---|
| 91 | "string, City string NOT NULL, StateProvinceID int NOT NULL, PostalCode string NOT NULL, " | 
|---|
| 92 | "SpatialLocation string, rowguid string, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 93 | REQUIRE_NO_FAIL(con.Query( "COPY Person.Address FROM 'test/sqlserver/data/Address.csv.gz' DELIMITER '\t';")); | 
|---|
| 94 |  | 
|---|
| 95 | REQUIRE_NO_FAIL( | 
|---|
| 96 | con.Query( "CREATE TABLE Person.StateProvince( StateProvinceID int NOT NULL, StateProvinceCode string NOT NULL, " | 
|---|
| 97 | "CountryRegionCode string NOT NULL, IsOnlyStateProvinceFlag string NOT NULL , Name string NOT NULL, " | 
|---|
| 98 | "TerritoryID int NOT NULL, rowguid string , ModifiedDate datetime NOT NULL); ")); | 
|---|
| 99 | REQUIRE_NO_FAIL( | 
|---|
| 100 | con.Query( "COPY Person.StateProvince FROM 'test/sqlserver/data/StateProvince.csv.gz' DELIMITER '\t';")); | 
|---|
| 101 |  | 
|---|
| 102 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE Person.CountryRegion( CountryRegionCode string NOT NULL, Name string NOT " | 
|---|
| 103 | "NULL, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 104 | REQUIRE_NO_FAIL( | 
|---|
| 105 | con.Query( "COPY Person.CountryRegion FROM 'test/sqlserver/data/CountryRegion.csv.gz' DELIMITER '\t';")); | 
|---|
| 106 |  | 
|---|
| 107 | REQUIRE_NO_FAIL( | 
|---|
| 108 | con.Query( "CREATE TABLE Person.EmailAddress( BusinessEntityID int NOT NULL, EmailAddressID int NOT NULL, " | 
|---|
| 109 | "EmailAddress string, rowguid string , ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 110 | REQUIRE_NO_FAIL( | 
|---|
| 111 | con.Query( "COPY Person.EmailAddress FROM 'test/sqlserver/data/EmailAddress.csv.gz' DELIMITER '|';")); | 
|---|
| 112 |  | 
|---|
| 113 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE Person.PersonPhone( BusinessEntityID int NOT NULL, PhoneNumber string NOT " | 
|---|
| 114 | "NULL, PhoneNumberTypeID int NOT NULL, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 115 | REQUIRE_NO_FAIL(con.Query( "COPY Person.PersonPhone FROM 'test/sqlserver/data/PersonPhone.csv.gz' DELIMITER '|';")); | 
|---|
| 116 |  | 
|---|
| 117 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE Person.PhoneNumberType( PhoneNumberTypeID int NOT NULL, Name string NOT " | 
|---|
| 118 | "NULL, ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 119 | REQUIRE_NO_FAIL( | 
|---|
| 120 | con.Query( "COPY Person.PhoneNumberType FROM 'test/sqlserver/data/PhoneNumberType.csv.gz' DELIMITER '|';")); | 
|---|
| 121 |  | 
|---|
| 122 | REQUIRE_NO_FAIL(con.Query( "CREATE SCHEMA Production;")); | 
|---|
| 123 |  | 
|---|
| 124 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 125 | "CREATE TABLE Production.Product( ProductID int NOT NULL, Name string NOT NULL, ProductNumber string NOT NULL, " | 
|---|
| 126 | "MakeFlag string NOT NULL , FinishedGoodsFlag string NOT NULL , Color string, SafetyStockLevel smallint NOT " | 
|---|
| 127 | "NULL, ReorderPoint smallint NOT NULL, StandardCost decimal(22,4) NOT NULL, ListPrice decimal(22,4) NOT NULL, " | 
|---|
| 128 | "Size string, SizeUnitMeasureCode string, WeightUnitMeasureCode string, Weight decimal(8, 2), " | 
|---|
| 129 | "DaysToManufacture int NOT NULL, ProductLine string, Class string, Style string, ProductSubcategoryID int, " | 
|---|
| 130 | "ProductModelID int, SellStartDate datetime NOT NULL, SellEndDate datetime, DiscontinuedDate datetime, rowguid " | 
|---|
| 131 | "string  , ModifiedDate datetime NOT NULL );")); | 
|---|
| 132 | REQUIRE_NO_FAIL(con.Query( "	COPY Production.Product FROM 'test/sqlserver/data/Product.csv.gz' DELIMITER '\t';")); | 
|---|
| 133 |  | 
|---|
| 134 | REQUIRE_NO_FAIL(con.Query( " CREATE TABLE Production.ProductInventory( ProductID int NOT NULL, LocationID smallint " | 
|---|
| 135 | "NOT NULL, Shelf string NOT NULL, Bin tinyint NOT NULL, Quantity smallint NOT NULL , " | 
|---|
| 136 | "rowguid string , ModifiedDate datetime NOT NULL ); ")); | 
|---|
| 137 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 138 | "	COPY Production.ProductInventory FROM 'test/sqlserver/data/ProductInventory.csv.gz' DELIMITER '\t';")); | 
|---|
| 139 |  | 
|---|
| 140 | // views | 
|---|
| 141 |  | 
|---|
| 142 | REQUIRE_NO_FAIL(con.Query( | 
|---|
| 143 | "CREATE VIEW Sales.vSalesPerson AS SELECT s.BusinessEntityID ,p.Title ,p.FirstName ,p.MiddleName ,p.LastName " | 
|---|
| 144 | ",p.Suffix ,e.JobTitle ,pp.PhoneNumber ,pnt.Name AS PhoneNumberType ,ea.EmailAddress ,p.EmailPromotion " | 
|---|
| 145 | ",a.AddressLine1 ,a.AddressLine2 ,a.City ,sp.Name AS StateProvinceName ,a.PostalCode ,cr.Name AS " | 
|---|
| 146 | "CountryRegionName ,st.Name AS TerritoryName ,st.Group_ AS TerritoryGroup ,s.SalesQuota ,s.SalesYTD " | 
|---|
| 147 | ",s.SalesLastYear FROM Sales.SalesPerson s INNER JOIN HumanResources.Employee e ON e.BusinessEntityID = " | 
|---|
| 148 | "s.BusinessEntityID INNER JOIN Person.Person p ON p.BusinessEntityID = s.BusinessEntityID INNER JOIN " | 
|---|
| 149 | "Person.BusinessEntityAddress bea ON bea.BusinessEntityID = s.BusinessEntityID INNER JOIN Person.Address a ON " | 
|---|
| 150 | "a.AddressID = bea.AddressID INNER JOIN Person.StateProvince sp ON sp.StateProvinceID = a.StateProvinceID " | 
|---|
| 151 | "INNER JOIN Person.CountryRegion cr ON cr.CountryRegionCode = sp.CountryRegionCode LEFT OUTER JOIN " | 
|---|
| 152 | "Sales.SalesTerritory st ON st.TerritoryID = s.TerritoryID LEFT OUTER JOIN Person.EmailAddress ea ON " | 
|---|
| 153 | "ea.BusinessEntityID = p.BusinessEntityID LEFT OUTER JOIN Person.PersonPhone pp ON pp.BusinessEntityID = " | 
|---|
| 154 | "p.BusinessEntityID LEFT OUTER JOIN Person.PhoneNumberType pnt ON pnt.PhoneNumberTypeID = " | 
|---|
| 155 | "pp.PhoneNumberTypeID; ")); | 
|---|
| 156 |  | 
|---|
| 157 | REQUIRE_NO_FAIL( | 
|---|
| 158 | con.Query( "CREATE VIEW HumanResources.vEmployeeDepartmentHistory AS SELECT e.BusinessEntityID ,p.Title " | 
|---|
| 159 | ",p.FirstName ,p.MiddleName ,p.LastName ,p.Suffix ,s.Name AS Shift ,d.Name AS Department " | 
|---|
| 160 | ",d.GroupName ,edh.StartDate ,edh.EndDate FROM HumanResources.Employee e INNER JOIN Person.Person p " | 
|---|
| 161 | "ON p.BusinessEntityID = e.BusinessEntityID INNER JOIN HumanResources.EmployeeDepartmentHistory edh " | 
|---|
| 162 | "ON e.BusinessEntityID = edh.BusinessEntityID INNER JOIN HumanResources.Department d ON " | 
|---|
| 163 | "edh.DepartmentID = d.DepartmentID INNER JOIN HumanResources.Shift s ON s.ShiftID = edh.ShiftID; ")); | 
|---|
| 164 |  | 
|---|
| 165 | // code below generated using scrape.py | 
|---|
| 166 |  | 
|---|
| 167 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/avg-transact-sql?view=sql-server-2017 | 
|---|
| 168 |  | 
|---|
| 169 | result = con.Query( "SELECT AVG(VacationHours)AS a, SUM(SickLeaveHours) AS b " | 
|---|
| 170 | " FROM HumanResources.Employee WHERE JobTitle LIKE 'Vice President%';"); | 
|---|
| 171 | REQUIRE(result->success); | 
|---|
| 172 | REQUIRE(result->types.size() == 2); | 
|---|
| 173 | REQUIRE(CHECK_COLUMN(result, 0, {25})); | 
|---|
| 174 | REQUIRE(CHECK_COLUMN(result, 1, {97})); | 
|---|
| 175 |  | 
|---|
| 176 | result = con.Query( "SELECT TerritoryID, AVG(Bonus)as a, SUM(SalesYTD) as b FROM " | 
|---|
| 177 | "Sales.SalesPerson GROUP BY TerritoryID order by TerritoryID; "); | 
|---|
| 178 | REQUIRE(result->success); | 
|---|
| 179 | REQUIRE(result->types.size() == 3); | 
|---|
| 180 | REQUIRE(CHECK_COLUMN(result, 0, {Value(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10})); | 
|---|
| 181 | REQUIRE(CHECK_COLUMN( | 
|---|
| 182 | result, 1, {0.00, 4133.3333, 4100.00, 2500.00, 2775.00, 6700.00, 2750.00, 985.00, 75.00, 5650.00, 5150.00})); | 
|---|
| 183 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 184 | {1252127.9471, 4502152.2674, 3763178.1787, 3189418.3662, 6709904.1666, 2315185.611, | 
|---|
| 185 | 4058260.1825, 3121616.3202, 1827066.7118, 1421810.9242, 4116871.2277})); | 
|---|
| 186 |  | 
|---|
| 187 | result = con.Query( "SELECT AVG(DISTINCT ListPrice) FROM Production.Product;"); | 
|---|
| 188 | REQUIRE(result->success); | 
|---|
| 189 | REQUIRE(result->types.size() == 1); | 
|---|
| 190 | // FIXME mismatch, probably down to missing DECIMAL type | 
|---|
| 191 | // REQUIRE(CHECK_COLUMN(result, 0, {437.4042})); | 
|---|
| 192 |  | 
|---|
| 193 | result = con.Query( "SELECT AVG(ListPrice) FROM Production.Product;"); | 
|---|
| 194 | REQUIRE(result->success); | 
|---|
| 195 | REQUIRE(result->types.size() == 1); | 
|---|
| 196 | REQUIRE(CHECK_COLUMN(result, 0, {438.6662})); | 
|---|
| 197 |  | 
|---|
| 198 | result = | 
|---|
| 199 | con.Query( "SELECT BusinessEntityID, TerritoryID ,YEAR(ModifiedDate) AS SalesYear " | 
|---|
| 200 | ",SalesYTD ,AVG(SalesYTD) OVER (PARTITION BY " | 
|---|
| 201 | "TerritoryID ORDER BY YEAR(ModifiedDate) ) AS MovingAvg ,SUM(SalesYTD) " | 
|---|
| 202 | "OVER (PARTITION BY TerritoryID ORDER BY YEAR(ModifiedDate) ) AS CumulativeTotal FROM " | 
|---|
| 203 | "Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY TerritoryID, SalesYear;"); | 
|---|
| 204 | REQUIRE(result->success); | 
|---|
| 205 | REQUIRE(result->types.size() == 6); | 
|---|
| 206 | // TODO needs double checking, probably using different adventureworks db | 
|---|
| 207 | //	REQUIRE(CHECK_COLUMN(result, 0, {274, 287, 285, 283, 280, 284, 275, 277, 276, 281})); | 
|---|
| 208 | //	REQUIRE(CHECK_COLUMN(result, 1, {Value(), Value(), Value(), 1, 1, 1, 2, 3, 4, 4})); | 
|---|
| 209 | //	REQUIRE(CHECK_COLUMN(result, 2, {2005, 2006, 2007, 2005, 2005, 2006, 2005, 2005, 2005, 2005})); | 
|---|
| 210 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 211 | //	                     {559697.56, 519905.93, 172524.45, 1573012.94, 1352577.13, 1576562.20, 3763178.18, | 
|---|
| 212 | // 3189418.37, 	                      4251368.55, 2458535.62})); 	REQUIRE(CHECK_COLUMN(result, 4, {559697.56, | 
|---|
| 213 | // 539801.75, 417375.98, 1462795.04, 1462795.04, 1500717.42, 3763178.18, 3189418.37, 3354952.08, 3354952.08})); | 
|---|
| 214 | //	REQUIRE(CHECK_COLUMN(result, 5, | 
|---|
| 215 | //	                     {559697.56, 1079603.50, 1252127.95, 2925590.07, 2925590.07, 4502152.27, 3763178.18, | 
|---|
| 216 | // 3189418.37, 	                      6709904.17, 6709904.17})); | 
|---|
| 217 | // | 
|---|
| 218 |  | 
|---|
| 219 | result = con.Query( "SELECT BusinessEntityID, TerritoryID ,YEAR(ModifiedDate) AS SalesYear ,SalesYTD " | 
|---|
| 220 | " ,AVG(SalesYTD) OVER (ORDER BY YEAR(ModifiedDate) ) AS MovingAvg " | 
|---|
| 221 | ",SUM(SalesYTD) OVER (ORDER BY YEAR(ModifiedDate) ) AS CumulativeTotal FROM " | 
|---|
| 222 | "Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY SalesYear;"); | 
|---|
| 223 | REQUIRE(result->success); | 
|---|
| 224 | REQUIRE(result->types.size() == 6); | 
|---|
| 225 | // TODO needs double checking, probably using different adventureworks db | 
|---|
| 226 | // | 
|---|
| 227 | //	REQUIRE(CHECK_COLUMN(result, 0, {274, 275, 276, 277, 280, 281, 283, 284, 287, 285})); | 
|---|
| 228 | //	REQUIRE(CHECK_COLUMN(result, 1, {Value(), 2, 4, 3, 1, 4, 1, 1, Value(), Value()})); | 
|---|
| 229 | //	REQUIRE(CHECK_COLUMN(result, 2, {2005, 2005, 2005, 2005, 2005, 2005, 2005, 2006, 2006, 2007})); | 
|---|
| 230 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 231 | //	                     {559697.56, 3763178.18, 4251368.55, 3189418.37, 1352577.13, 2458535.62, 1573012.94, | 
|---|
| 232 | // 1576562.20, 	                      519905.93, 172524.45})); 	REQUIRE(CHECK_COLUMN(result, 4, {2449684.05, | 
|---|
| 233 | // 2449684.05, 2449684.05, 2449684.05, 2449684.05, 2449684.05, 2449684.05, 	                      2138250.72, | 
|---|
| 234 | // 2138250.72, 1941678.09})); 	REQUIRE(CHECK_COLUMN(result, 5, 	                     {17147788.35, 17147788.35, | 
|---|
| 235 | // 17147788.35, 17147788.35, | 
|---|
| 236 | // 17147788.35, 17147788.35, 17147788.35, 	                      19244256.47, 19244256.47, 19416780.93})); | 
|---|
| 237 |  | 
|---|
| 238 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/count-transact-sql?view=sql-server-2017 | 
|---|
| 239 |  | 
|---|
| 240 | // TODO report bug, original query has "Title" | 
|---|
| 241 | // TODO casting issue | 
|---|
| 242 | result = con.Query( "SELECT COUNT(DISTINCT JobTitle) FROM HumanResources.Employee; "); | 
|---|
| 243 | //	REQUIRE(result->success); | 
|---|
| 244 | //	REQUIRE(result->types.size() == 1); | 
|---|
| 245 | //	REQUIRE(CHECK_COLUMN(result, 0, {67})); | 
|---|
| 246 |  | 
|---|
| 247 | result = con.Query( "SELECT COUNT(*) FROM HumanResources.Employee; "); | 
|---|
| 248 | REQUIRE(result->success); | 
|---|
| 249 | REQUIRE(result->types.size() == 1); | 
|---|
| 250 | REQUIRE(CHECK_COLUMN(result, 0, {290})); | 
|---|
| 251 |  | 
|---|
| 252 | result = con.Query( "SELECT COUNT(*), AVG(Bonus) FROM Sales.SalesPerson WHERE SalesQuota > 25000; "); | 
|---|
| 253 | REQUIRE(result->success); | 
|---|
| 254 | REQUIRE(result->types.size() == 2); | 
|---|
| 255 | REQUIRE(CHECK_COLUMN(result, 0, {14})); | 
|---|
| 256 | REQUIRE(CHECK_COLUMN(result, 1, {3472.1428})); | 
|---|
| 257 |  | 
|---|
| 258 | result = | 
|---|
| 259 | con.Query( "SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER " | 
|---|
| 260 | "(PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS " | 
|---|
| 261 | "AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept " | 
|---|
| 262 | "FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh " | 
|---|
| 263 | "ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON " | 
|---|
| 264 | "d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name;"); | 
|---|
| 265 | REQUIRE(result->success); | 
|---|
| 266 | REQUIRE(result->types.size() == 5); | 
|---|
| 267 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 268 | { "Document Control", "Engineering", "Executive", "Facilities and Maintenance", "Finance", | 
|---|
| 269 | "Human Resources", "Information Services", "Marketing", "Production", "Production Control", | 
|---|
| 270 | "Purchasing", "Quality Assurance", "Research and Development", "Sales", | 
|---|
| 271 | "Shipping and Receiving", "Tool Design"})); | 
|---|
| 272 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 273 | {10.25, 32.6923, 39.06, 9.25, 13.4615, 13.9423, 27.4038, 13.4615, 6.50, 8.62, 9.86, 10.5769, | 
|---|
| 274 | 40.8654, 23.0769, 9.00, 8.62})); | 
|---|
| 275 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 276 | {17.7885, 63.4615, 125.50, 24.0385, 43.2692, 27.1394, 50.4808, 37.50, 84.1346, 24.5192, 30.00, | 
|---|
| 277 | 28.8462, 50.4808, 72.1154, 19.2308, 29.8462})); | 
|---|
| 278 | // TODO numeric drift | 
|---|
| 279 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 280 | //	                     {14.3884, 40.1442, 68.3034, 13.0316, 23.935, 18.0248, 34.1586, 18.4318, 13.5537, 16.7746, | 
|---|
| 281 | //	                      18.0202, 15.4647, 43.6731, 29.9719, 10.8718, 23.5054})); | 
|---|
| 282 | REQUIRE(CHECK_COLUMN(result, 4, {5, 6, 4, 7, 10, 6, 10, 11, 195, 8, 14, 6, 4, 18, 6, 6})); | 
|---|
| 283 |  | 
|---|
| 284 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/max-transact-sql?view=sql-server-2017 | 
|---|
| 285 |  | 
|---|
| 286 | result = con.Query( "SELECT MAX(TaxRate) FROM Sales.SalesTaxRate; "); | 
|---|
| 287 | REQUIRE(result->success); | 
|---|
| 288 | REQUIRE(result->types.size() == 1); | 
|---|
| 289 | REQUIRE(CHECK_COLUMN(result, 0, {19.60})); | 
|---|
| 290 |  | 
|---|
| 291 | result = | 
|---|
| 292 | con.Query( "SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER " | 
|---|
| 293 | "(PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS " | 
|---|
| 294 | "AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept " | 
|---|
| 295 | "FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh " | 
|---|
| 296 | "ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON " | 
|---|
| 297 | "d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name;"); | 
|---|
| 298 | REQUIRE(result->success); | 
|---|
| 299 | REQUIRE(result->types.size() == 5); | 
|---|
| 300 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 301 | { "Document Control", "Engineering", "Executive", "Facilities and Maintenance", "Finance", | 
|---|
| 302 | "Human Resources", "Information Services", "Marketing", "Production", "Production Control", | 
|---|
| 303 | "Purchasing", "Quality Assurance", "Research and Development", "Sales", | 
|---|
| 304 | "Shipping and Receiving", "Tool Design"})); | 
|---|
| 305 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 306 | {10.25, 32.6923, 39.06, 9.25, 13.4615, 13.9423, 27.4038, 13.4615, 6.50, 8.62, 9.86, 10.5769, | 
|---|
| 307 | 40.8654, 23.0769, 9.00, 8.62})); | 
|---|
| 308 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 309 | {17.7885, 63.4615, 125.50, 24.0385, 43.2692, 27.1394, 50.4808, 37.50, 84.1346, 24.5192, 30.00, | 
|---|
| 310 | 28.8462, 50.4808, 72.1154, 19.2308, 29.8462})); | 
|---|
| 311 | // TODO numeric drift | 
|---|
| 312 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 313 | //	                     {14.3884, 40.1442, 68.3034, 13.0316, 23.935, 18.0248, 34.1586, 18.4318, 13.5537, 16.7746, | 
|---|
| 314 | //	                      18.0202, 15.4647, 43.6731, 29.9719, 10.8718, 23.5054})); | 
|---|
| 315 | REQUIRE(CHECK_COLUMN(result, 4, {5, 6, 4, 7, 10, 6, 10, 11, 195, 8, 14, 6, 4, 18, 6, 6})); | 
|---|
| 316 |  | 
|---|
| 317 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/min-transact-sql?view=sql-server-2017 | 
|---|
| 318 |  | 
|---|
| 319 | result = con.Query( "SELECT MIN(TaxRate) FROM Sales.SalesTaxRate; "); | 
|---|
| 320 | REQUIRE(result->success); | 
|---|
| 321 | REQUIRE(result->types.size() == 1); | 
|---|
| 322 | REQUIRE(CHECK_COLUMN(result, 0, {5.00})); | 
|---|
| 323 |  | 
|---|
| 324 | result = | 
|---|
| 325 | con.Query( "SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER " | 
|---|
| 326 | "(PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS " | 
|---|
| 327 | "AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept " | 
|---|
| 328 | "FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh " | 
|---|
| 329 | "ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON " | 
|---|
| 330 | "d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name;"); | 
|---|
| 331 | REQUIRE(result->success); | 
|---|
| 332 | REQUIRE(result->types.size() == 5); | 
|---|
| 333 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 334 | { "Document Control", "Engineering", "Executive", "Facilities and Maintenance", "Finance", | 
|---|
| 335 | "Human Resources", "Information Services", "Marketing", "Production", "Production Control", | 
|---|
| 336 | "Purchasing", "Quality Assurance", "Research and Development", "Sales", | 
|---|
| 337 | "Shipping and Receiving", "Tool Design"})); | 
|---|
| 338 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 339 | {10.25, 32.6923, 39.06, 9.25, 13.4615, 13.9423, 27.4038, 13.4615, 6.50, 8.62, 9.86, 10.5769, | 
|---|
| 340 | 40.8654, 23.0769, 9.00, 8.62})); | 
|---|
| 341 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 342 | {17.7885, 63.4615, 125.50, 24.0385, 43.2692, 27.1394, 50.4808, 37.50, 84.1346, 24.5192, 30.00, | 
|---|
| 343 | 28.8462, 50.4808, 72.1154, 19.2308, 29.8462})); | 
|---|
| 344 | // TODO numeric drift | 
|---|
| 345 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 346 | //	                     {14.3884, 40.1442, 68.3034, 13.0316, 23.935, 18.0248, 34.1586, 18.4318, 13.5537, 16.7746, | 
|---|
| 347 | //	                      18.0202, 15.4647, 43.6731, 29.9719, 10.8718, 23.5054})); | 
|---|
| 348 | REQUIRE(CHECK_COLUMN(result, 4, {5, 6, 4, 7, 10, 6, 10, 11, 195, 8, 14, 6, 4, 18, 6, 6})); | 
|---|
| 349 |  | 
|---|
| 350 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/stdev-transact-sql?view=sql-server-2017 | 
|---|
| 351 |  | 
|---|
| 352 | // TODO unclear what the result is | 
|---|
| 353 | //	result = con.Query("SELECT STDEV(Bonus) FROM Sales.SalesPerson; "); | 
|---|
| 354 | //	REQUIRE(result->success); | 
|---|
| 355 | //	REQUIRE(result->types.size() == 2); | 
|---|
| 356 | //	REQUIRE(CHECK_COLUMN(result, 0, {398974.27})); | 
|---|
| 357 | //	REQUIRE(CHECK_COLUMN(result, 1, {398450.57})); | 
|---|
| 358 |  | 
|---|
| 359 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/sum-transact-sql?view=sql-server-2017 | 
|---|
| 360 |  | 
|---|
| 361 | result = con.Query( "SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product WHERE Color IS NOT " | 
|---|
| 362 | "NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' GROUP BY Color ORDER BY Color; "); | 
|---|
| 363 | REQUIRE(result->success); | 
|---|
| 364 | REQUIRE(result->types.size() == 3); | 
|---|
| 365 | REQUIRE(CHECK_COLUMN(result, 0, { "Black", "Silver", "White"})); | 
|---|
| 366 | REQUIRE(CHECK_COLUMN(result, 1, {27404.84, 26462.84, 19.00})); | 
|---|
| 367 | REQUIRE(CHECK_COLUMN(result, 2, {15214.9616, 14665.6792, 6.7926})); | 
|---|
| 368 | // TODO report error on third column, first val. in doc its 5214.9616 | 
|---|
| 369 |  | 
|---|
| 370 | result = | 
|---|
| 371 | con.Query( "SELECT BusinessEntityID, TerritoryID ,YEAR(ModifiedDate) AS SalesYear " | 
|---|
| 372 | ",SalesYTD ,AVG(SalesYTD) OVER (PARTITION BY " | 
|---|
| 373 | "TerritoryID ORDER BY YEAR(ModifiedDate) ) AS MovingAvg ,SUM(SalesYTD) " | 
|---|
| 374 | "OVER (PARTITION BY TerritoryID ORDER BY YEAR(ModifiedDate) ) AS CumulativeTotal FROM " | 
|---|
| 375 | "Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY TerritoryID,SalesYear;"); | 
|---|
| 376 | REQUIRE(result->success); | 
|---|
| 377 | REQUIRE(result->types.size() == 6); | 
|---|
| 378 | // TODO needs double checking, probably using different adventureworks db | 
|---|
| 379 | // | 
|---|
| 380 | //	REQUIRE(CHECK_COLUMN(result, 0, {274, 287, 285, 283, 280, 284, 275, 277, 276, 281})); | 
|---|
| 381 | //	REQUIRE(CHECK_COLUMN(result, 1, {Value(), Value(), Value(), 1, 1, 1, 2, 3, 4, 4})); | 
|---|
| 382 | //	REQUIRE(CHECK_COLUMN(result, 2, {2005, 2006, 2007, 2005, 2005, 2006, 2005, 2005, 2005, 2005})); | 
|---|
| 383 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 384 | //	                     {559697.56, 519905.93, 172524.45, 1573012.94, 1352577.13, 1576562.20, 3763178.18, | 
|---|
| 385 | // 3189418.37, 	                      4251368.55, 2458535.62})); 	REQUIRE(CHECK_COLUMN(result, 4, {559697.56, | 
|---|
| 386 | // 539801.75, 417375.98, 1462795.04, 1462795.04, 1500717.42, 3763178.18, 3189418.37, 3354952.08, 3354952.08})); | 
|---|
| 387 | //	REQUIRE(CHECK_COLUMN(result, 5, | 
|---|
| 388 | //	                     {559697.56, 1079603.50, 1252127.95, 2925590.07, 2925590.07, 4502152.27, 3763178.18, | 
|---|
| 389 | // 3189418.37, 	                      6709904.17, 6709904.17})); | 
|---|
| 390 |  | 
|---|
| 391 | result = con.Query( "SELECT BusinessEntityID, TerritoryID ,YEAR(ModifiedDate) AS SalesYear ,SalesYTD " | 
|---|
| 392 | " ,AVG(SalesYTD) OVER (ORDER BY YEAR(ModifiedDate) ) AS MovingAvg " | 
|---|
| 393 | ",SUM(SalesYTD) OVER (ORDER BY YEAR(ModifiedDate) ) AS CumulativeTotal FROM " | 
|---|
| 394 | "Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY SalesYear;"); | 
|---|
| 395 | REQUIRE(result->success); | 
|---|
| 396 | REQUIRE(result->types.size() == 6); | 
|---|
| 397 | // TODO needs double checking, probably using different adventureworks db | 
|---|
| 398 | // | 
|---|
| 399 | //	REQUIRE(CHECK_COLUMN(result, 0, {274, 275, 276, 277, 280, 281, 283, 284, 287, 285})); | 
|---|
| 400 | //	REQUIRE(CHECK_COLUMN(result, 1, {Value(), 2, 4, 3, 1, 4, 1, 1, Value(), Value()})); | 
|---|
| 401 | //	REQUIRE(CHECK_COLUMN(result, 2, {2005, 2005, 2005, 2005, 2005, 2005, 2005, 2006, 2006, 2007})); | 
|---|
| 402 | //	REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 403 | //	                     {559697.56, 3763178.18, 4251368.55, 3189418.37, 1352577.13, 2458535.62, 1573012.94, | 
|---|
| 404 | // 1576562.20, 	                      519905.93, 172524.45})); 	REQUIRE(CHECK_COLUMN(result, 4, {2449684.05, | 
|---|
| 405 | // 2449684.05, 2449684.05, 2449684.05, 2449684.05, 2449684.05, 2449684.05, 	                      2138250.72, | 
|---|
| 406 | // 2138250.72, 1941678.09})); 	REQUIRE(CHECK_COLUMN(result, 5, 	                     {17147788.35, 17147788.35, | 
|---|
| 407 | // 17147788.35, 17147788.35, | 
|---|
| 408 | // 17147788.35, 17147788.35, 17147788.35, 	                      19244256.47, 19244256.47, 19416780.93})); | 
|---|
| 409 |  | 
|---|
| 410 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/var-transact-sql?view=sql-server-2017 | 
|---|
| 411 | // TODO not supported | 
|---|
| 412 | //	result = con.Query("SELECT VAR(Bonus) FROM Sales.SalesPerson; "); | 
|---|
| 413 | //	REQUIRE(result->success); | 
|---|
| 414 | //	REQUIRE(result->types.size() == 2); | 
|---|
| 415 | //	REQUIRE(CHECK_COLUMN(result, 0, {159180469909.18})); | 
|---|
| 416 | //	REQUIRE(CHECK_COLUMN(result, 1, {158762853821.10})); | 
|---|
| 417 |  | 
|---|
| 418 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/cume-dist-transact-sql?view=sql-server-2017 | 
|---|
| 419 |  | 
|---|
| 420 | // TODO fix casting issue in this query | 
|---|
| 421 | //	result = con.Query(" SELECT Department, LastName, Rate, CUME_DIST () OVER (PARTITION BY Department ORDER BY | 
|---|
| 422 | // Rate) " 	                   "AS CumeDist, PERCENT_RANK() OVER (PARTITION BY Department ORDER BY Rate ) AS PctRank | 
|---|
| 423 | // FROM " 	                   "HumanResources.vEmployeeDepartmentHistory AS edh INNER JOIN | 
|---|
| 424 | // HumanResources.EmployeePayHistory " "AS e ON e.BusinessEntityID = edh.BusinessEntityID WHERE Department IN | 
|---|
| 425 | // (N'Information " "Services',N'Document Control') | 
|---|
| 426 | // ORDER BY Department, Rate DESC;"); 	REQUIRE(result->success); 	REQUIRE(result->types.size() == 5); 	REQUIRE( | 
|---|
| 427 | //	    CHECK_COLUMN(result, 0, | 
|---|
| 428 | //	                 {"Document Control", "Document Control", "Document Control", "Document Control", | 
|---|
| 429 | //	                  "Document Control", "Information Services", "Information Services", "Information Services", | 
|---|
| 430 | //	                  "Information Services", "Information Services", "Information Services", "Information | 
|---|
| 431 | // Services", 	                  "Information Services", "Information Services", "Information Services"})); | 
|---|
| 432 | // REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 433 | //	                     {"Arifin", "Norred", "Kharatishvili", "Chai", "Berge", "Trenary", "Conroy", "Ajenstat", | 
|---|
| 434 | //	                      "Wilson", "Sharma", "Connelly", "Berg", "Meyyappan", "Bacon", "Bueno"})); | 
|---|
| 435 | //	REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 436 | //	                     {17.7885, 16.8269, 16.8269, 10.25, 10.25, 50.4808, 39.6635, 38.4615, 38.4615, | 
|---|
| 437 | // 32.4519, 32.4519, 	                      27.4038, 27.4038, 27.4038, 27.4038})); 	REQUIRE(CHECK_COLUMN(result, | 
|---|
| 438 | // 3, {1, 0.8, 0.8, 0.4, 0.4, 1, 0.9, 0.8, 0.8, 0.6, 0.6, 0.4, 0.4, 0.4, 0.4})); 	REQUIRE(CHECK_COLUMN(result, 4, | 
|---|
| 439 | // {1, 0.5, 0.5, 0, 0, 1, 0.888888888888889, 0.666666666666667, 0.666666666666667, 0.444444444444444, | 
|---|
| 440 | // 0.444444444444444, 0, 0, 0, 0})); | 
|---|
| 441 |  | 
|---|
| 442 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/first-value-transact-sql?view=sql-server-2017 | 
|---|
| 443 |  | 
|---|
| 444 | result = con.Query( " SELECT Name, ListPrice, FIRST_VALUE(Name) OVER (ORDER BY ListPrice ASC) AS LeastExpensive " | 
|---|
| 445 | "FROM Production.Product WHERE ProductSubcategoryID = 37 ORDER BY ListPrice, Name DESC;"); | 
|---|
| 446 | REQUIRE(result->success); | 
|---|
| 447 | REQUIRE(result->types.size() == 3); | 
|---|
| 448 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 449 | { "Patch Kit/8 Patches", "Road Tire Tube", "Touring Tire Tube", "Mountain Tire Tube", | 
|---|
| 450 | "LL Road Tire", "ML Road Tire", "LL Mountain Tire", "Touring Tire", "ML Mountain Tire", | 
|---|
| 451 | "HL Road Tire", "HL Mountain Tire"})); | 
|---|
| 452 | REQUIRE(CHECK_COLUMN(result, 1, {2.29, 3.99, 4.99, 4.99, 21.49, 24.99, 24.99, 28.99, 29.99, 32.60, 35.00})); | 
|---|
| 453 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 454 | { "Patch Kit/8 Patches", "Patch Kit/8 Patches", "Patch Kit/8 Patches", "Patch Kit/8 Patches", | 
|---|
| 455 | "Patch Kit/8 Patches", "Patch Kit/8 Patches", "Patch Kit/8 Patches", "Patch Kit/8 Patches", | 
|---|
| 456 | "Patch Kit/8 Patches", "Patch Kit/8 Patches", "Patch Kit/8 Patches"})); | 
|---|
| 457 |  | 
|---|
| 458 | // TODO fix casting issue | 
|---|
| 459 | //	result = | 
|---|
| 460 | //	    con.Query(" SELECT JobTitle, LastName, VacationHours, FIRST_VALUE(LastName) OVER (PARTITION BY JobTitle | 
|---|
| 461 | // ORDER " 	              "BY VacationHours ASC ROWS UNBOUNDED PRECEDING ) AS FewestVacationHours FROM | 
|---|
| 462 | // HumanResources.Employee " 	              "AS e INNER JOIN Person.Person AS p ON e.BusinessEntityID = | 
|---|
| 463 | // p.BusinessEntityID ORDER BY JobTitle;"); 	REQUIRE(result->success); 	REQUIRE(result->types.size() == 4); | 
|---|
| 464 | //	REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 465 | //	                     {"Accountant", "Accountant", "Accounts Manager", "Accounts Payable Specialist", | 
|---|
| 466 | //	                      "Accounts Payable Specialist", "Accounts Receivable Specialist", | 
|---|
| 467 | //	                      "Accounts Receivable Specialist", "Accounts Receivable Specialist"})); | 
|---|
| 468 | //	REQUIRE(CHECK_COLUMN(result, 1, {"Moreland", "Seamans", "Liu", "Tomic", "Sheperdigian", "Poe", "Spoon", | 
|---|
| 469 | //"Walton"})); 	REQUIRE(CHECK_COLUMN(result, 2, {58, 59, 57, 63, 64, 60, 61, 62})); 	REQUIRE(CHECK_COLUMN(result, | 
|---|
| 470 | // 3, | 
|---|
| 471 | //{"Moreland", "Moreland", "Liu", "Tomic", "Tomic", "Poe", "Poe", "Poe"})); | 
|---|
| 472 |  | 
|---|
| 473 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/last-value-transact-sql?view=sql-server-2017 | 
|---|
| 474 |  | 
|---|
| 475 | // TODO fix casting issue | 
|---|
| 476 | result = con.Query( " SELECT Department, LastName, Rate, HireDate, LAST_VALUE(HireDate) OVER (PARTITION BY " | 
|---|
| 477 | "Department ORDER BY Rate) AS LastValue FROM HumanResources.vEmployeeDepartmentHistory AS edh " | 
|---|
| 478 | "INNER JOIN HumanResources.EmployeePayHistory AS eph ON eph.BusinessEntityID = " | 
|---|
| 479 | "edh.BusinessEntityID INNER JOIN HumanResources.Employee AS e ON e.BusinessEntityID = " | 
|---|
| 480 | "edh.BusinessEntityID WHERE Department IN (N'Information Services',N'Document Control');"); | 
|---|
| 481 | //	REQUIRE(result->success); | 
|---|
| 482 | //	REQUIRE(result->types.size() == 5); | 
|---|
| 483 | //	REQUIRE( | 
|---|
| 484 | //	    CHECK_COLUMN(result, 0, | 
|---|
| 485 | //	                 {"Document Control", "Document Control", "Document Control", "Document Control", | 
|---|
| 486 | //	                  "Document Control", "Information Services", "Information Services", "Information Services", | 
|---|
| 487 | //	                  "Information Services", "Information Services", "Information Services", "Information | 
|---|
| 488 | // Services", 	                  "Information Services", "Information Services", "Information Services"})); | 
|---|
| 489 | // REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 490 | //	                     {"Chai", "Berge", "Norred", "Kharatishvili", "Arifin", "Berg", "Meyyappan", "Bacon", | 
|---|
| 491 | //"Bueno", 	                      "Sharma", "Connelly", "Ajenstat", "Wilson", "Conroy", "Trenary"})); | 
|---|
| 492 | // REQUIRE(CHECK_COLUMN(result, 2, 	                     {10.25, 10.25, 16.8269, 16.8269, 17.7885, 27.4038, | 
|---|
| 493 | // 27.4038, 27.4038, 27.4038, | 
|---|
| 494 | // 32.4519, 32.4519, 	                      38.4615, 38.4615, 39.6635, 50.4808})); 	REQUIRE(CHECK_COLUMN(result, | 
|---|
| 495 | // 3, | 
|---|
| 496 | //	                     {"2003-02-23", "2003-03-13", "2003-04-07", "2003-01-17", "2003-02-05", "2003-03-20", | 
|---|
| 497 | //	                      "2003-03-07", "2003-02-12", "2003-01-24", "2003-01-05", "2003-03-27", "2003-02-18", | 
|---|
| 498 | //	                      "2003-02-23", "2003-03-08", "2003-01-12"})); | 
|---|
| 499 | //	REQUIRE(CHECK_COLUMN(result, 4, | 
|---|
| 500 | //	                     {"2003-03-13", "2003-03-13", "2003-01-17", "2003-01-17", "2003-02-05", "2003-01-24", | 
|---|
| 501 | //	                      "2003-01-24", "2003-01-24", "2003-01-24", "2003-03-27", "2003-03-27", "2003-02-23", | 
|---|
| 502 | //	                      "2003-02-23", "2003-03-08", "2003-01-12"})); | 
|---|
| 503 |  | 
|---|
| 504 | // TODO date part quarter impl | 
|---|
| 505 | result = con.Query( | 
|---|
| 506 | " SELECT BusinessEntityID, DATEPART(QUARTER,QuotaDate)AS Quarter, YEAR(QuotaDate) AS SalesYear, SalesQuota AS " | 
|---|
| 507 | "QuotaThisQuarter, SalesQuota - FIRST_VALUE(SalesQuota) OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) " | 
|---|
| 508 | "ORDER BY DATEPART(QUARTER,QuotaDate) ) AS DifferenceFromFirstQuarter, SalesQuota - LAST_VALUE(SalesQuota) " | 
|---|
| 509 | "OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) ORDER BY DATEPART(QUARTER,QuotaDate) RANGE BETWEEN " | 
|---|
| 510 | "CURRENT ROW AND UNBOUNDED FOLLOWING ) AS DifferenceFromLastQuarter FROM Sales.SalesPersonQuotaHistory WHERE " | 
|---|
| 511 | "YEAR(QuotaDate) > 2005 AND BusinessEntityID BETWEEN 274 AND 275 ORDER BY BusinessEntityID, SalesYear, " | 
|---|
| 512 | "Quarter;"); | 
|---|
| 513 | //	REQUIRE(result->success); | 
|---|
| 514 | //	REQUIRE(result->types.size() == 6); | 
|---|
| 515 | //	REQUIRE(CHECK_COLUMN(result, 0, {274, 274, 274, 274, 274, 274, 274, 274, 274, 274, | 
|---|
| 516 | //	                                 275, 275, 275, 275, 275, 275, 275, 275, 275, 275})); | 
|---|
| 517 | //	REQUIRE(CHECK_COLUMN(result, 1, {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2})); | 
|---|
| 518 | //	REQUIRE(CHECK_COLUMN(result, 2, {2006, 2006, 2006, 2006, 2007, 2007, 2007, 2007, 2008, 2008, | 
|---|
| 519 | //	                                 2006, 2006, 2006, 2006, 2007, 2007, 2007, 2007, 2008, 2008})); | 
|---|
| 520 | //	REQUIRE(CHECK_COLUMN(result, 3, {91000.00,  140000.00,  70000.00,   154000.00,  107000.00, 58000.00, 263000.00, | 
|---|
| 521 | //	                                 116000.00, 84000.00,   187000.00,  502000.00,  550000.00, 1429000.00, | 
|---|
| 522 | // 1324000.00, 	                                 729000.00, 1194000.00, 1575000.00, 1218000.00, 849000.00, | 
|---|
| 523 | // 869000.00})); 	REQUIRE(CHECK_COLUMN(result, 4, {0.00,    49000.00,  -21000.00, 63000.00,  0.00,     -49000.00, | 
|---|
| 524 | // 156000.00, 	                                 9000.00, 0.00,      103000.00, 0.00, 48000.00, 927000.00, | 
|---|
| 525 | // 822000.00, 	                                 0.00,    465000.00, 846000.00, 489000.00, 0.00,     20000.00})); | 
|---|
| 526 | //	REQUIRE(CHECK_COLUMN(result, 5, {-63000.00,  -14000.00,  -84000.00, 0.00,       -9000.00,   -58000.00, | 
|---|
| 527 | // 147000.00, 	                                 0.00,       -103000.00, 0.00,      -822000.00, -774000.00, | 
|---|
| 528 | // 105000.00, 0.00, 	                                 -489000.00, -24000.00, 357000.00, 0.00,       -20000.00, | 
|---|
| 529 | // 0.00})); | 
|---|
| 530 |  | 
|---|
| 531 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-2017 | 
|---|
| 532 |  | 
|---|
| 533 | // TODO wrong years | 
|---|
| 534 | result = | 
|---|
| 535 | con.Query( " SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, LAG(SalesQuota, " | 
|---|
| 536 | "1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota FROM Sales.SalesPersonQuotaHistory WHERE " | 
|---|
| 537 | "BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');"); | 
|---|
| 538 | REQUIRE(result->success); | 
|---|
| 539 | REQUIRE(result->types.size() == 4); | 
|---|
| 540 | //	REQUIRE(CHECK_COLUMN(result, 0, {275, 275, 275, 275, 275, 275})); | 
|---|
| 541 | //	REQUIRE(CHECK_COLUMN(result, 1, {2005, 2005, 2006, 2006, 2006, 2006})); | 
|---|
| 542 | //	REQUIRE(CHECK_COLUMN(result, 2, {367000.00, 556000.00, 502000.00, 550000.00, 1429000.00, 1324000.00})); | 
|---|
| 543 | //	REQUIRE(CHECK_COLUMN(result, 3, {0.00, 367000.00, 556000.00, 502000.00, 550000.00, 1429000.00})); | 
|---|
| 544 |  | 
|---|
| 545 | result = con.Query( " SELECT TerritoryName, BusinessEntityID, SalesYTD, LAG (SalesYTD, 1, 0) OVER (PARTITION BY " | 
|---|
| 546 | "TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales FROM Sales.vSalesPerson WHERE " | 
|---|
| 547 | "TerritoryName IN (N'Northwest', N'Canada') ORDER BY TerritoryName, SalesYTD DESC;"); | 
|---|
| 548 | REQUIRE(result->success); | 
|---|
| 549 | REQUIRE(result->types.size() == 4); | 
|---|
| 550 | REQUIRE(CHECK_COLUMN(result, 0, { "Canada", "Canada", "Northwest", "Northwest", "Northwest"})); | 
|---|
| 551 | REQUIRE(CHECK_COLUMN(result, 1, {282, 278, 284, 283, 280})); | 
|---|
| 552 | REQUIRE(CHECK_COLUMN(result, 2, {2604540.7172, 1453719.4653, 1576562.1966, 1573012.9383, 1352577.1325})); | 
|---|
| 553 | REQUIRE(CHECK_COLUMN(result, 3, {0.00, 2604540.7172, 0.00, 1576562.1966, 1573012.9383})); | 
|---|
| 554 |  | 
|---|
| 555 | REQUIRE_NO_FAIL(con.Query( "CREATE TABLE T (a int, b int, c int);")); | 
|---|
| 556 | REQUIRE_NO_FAIL( | 
|---|
| 557 | con.Query( "INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);")); | 
|---|
| 558 |  | 
|---|
| 559 | result = con.Query( "SELECT b, c, LAG(2*c, b*(SELECT MIN(b) FROM T), " | 
|---|
| 560 | "-c/2.0) OVER (ORDER BY a) AS i FROM T;"); | 
|---|
| 561 | REQUIRE(result->success); | 
|---|
| 562 | REQUIRE(result->types.size() == 3); | 
|---|
| 563 | REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 1, 3, 2, 1})); | 
|---|
| 564 | REQUIRE(CHECK_COLUMN(result, 1, {-3, 4, Value(), 1, Value(), 5})); | 
|---|
| 565 | REQUIRE(CHECK_COLUMN(result, 2, {1, -2, 8, -6, Value(), Value()})); | 
|---|
| 566 |  | 
|---|
| 567 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/lead-transact-sql?view=sql-server-2017 | 
|---|
| 568 | result = | 
|---|
| 569 | con.Query( " SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, " | 
|---|
| 570 | "LEAD(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS NextQuota FROM " | 
|---|
| 571 | "Sales.SalesPersonQuotaHistory WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');"); | 
|---|
| 572 | REQUIRE(result->success); | 
|---|
| 573 | // TODO wrong years | 
|---|
| 574 | //	REQUIRE(result->types.size() == 4); | 
|---|
| 575 | //	REQUIRE(CHECK_COLUMN(result, 0, {275, 275, 275, 275, 275, 275})); | 
|---|
| 576 | //	REQUIRE(CHECK_COLUMN(result, 1, {2005, 2005, 2006, 2006, 2006, 2006})); | 
|---|
| 577 | //	REQUIRE(CHECK_COLUMN(result, 2, {367000.00, 556000.00, 502000.00, 550000.00, 1429000.00, 1324000.00})); | 
|---|
| 578 | //	REQUIRE(CHECK_COLUMN(result, 3, {556000.00, 502000.00, 550000.00, 1429000.00, 1324000.00, 0.00})); | 
|---|
| 579 |  | 
|---|
| 580 | result = con.Query( " SELECT TerritoryName, BusinessEntityID, SalesYTD, LEAD (SalesYTD, 1, 0) OVER (PARTITION BY " | 
|---|
| 581 | "TerritoryName ORDER BY SalesYTD DESC) AS NextRepSales FROM Sales.vSalesPerson WHERE " | 
|---|
| 582 | "TerritoryName IN (N'Northwest', N'Canada') ORDER BY TerritoryName, BusinessEntityID DESC;"); | 
|---|
| 583 | REQUIRE(result->success); | 
|---|
| 584 | REQUIRE(result->types.size() == 4); | 
|---|
| 585 | REQUIRE(CHECK_COLUMN(result, 0, { "Canada", "Canada", "Northwest", "Northwest", "Northwest"})); | 
|---|
| 586 | REQUIRE(CHECK_COLUMN(result, 1, {282, 278, 284, 283, 280})); | 
|---|
| 587 | REQUIRE(CHECK_COLUMN(result, 2, {2604540.7172, 1453719.4653, 1576562.1966, 1573012.9383, 1352577.1325})); | 
|---|
| 588 | REQUIRE(CHECK_COLUMN(result, 3, {1453719.4653, 0.00, 1573012.9383, 1352577.1325, 0.00})); | 
|---|
| 589 |  | 
|---|
| 590 | result = con.Query( "SELECT b, c, LEAD(2*c, b*(SELECT MIN(b) FROM T), " | 
|---|
| 591 | "-c/2.0) OVER (ORDER BY a) AS i FROM T;"); | 
|---|
| 592 | REQUIRE(result->success); | 
|---|
| 593 | REQUIRE(result->types.size() == 3); | 
|---|
| 594 | REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 1, 3, 2, 1})); | 
|---|
| 595 | REQUIRE(CHECK_COLUMN(result, 1, {-3, 4, Value(), 1, Value(), 5})); | 
|---|
| 596 | // TODO unclear whats going on | 
|---|
| 597 | // REQUIRE(CHECK_COLUMN(result, 2, {8, 2, 2, 0, Value(), -2})); | 
|---|
| 598 |  | 
|---|
| 599 | REQUIRE_NO_FAIL(con.Query( "DROP TABLE T;")); | 
|---|
| 600 |  | 
|---|
| 601 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/percent-rank-transact-sql?view=sql-server-2017 | 
|---|
| 602 |  | 
|---|
| 603 | result = con.Query( "SELECT Department, LastName, Rate, CUME_DIST () OVER (PARTITION BY Department ORDER BY Rate) " | 
|---|
| 604 | "AS CumeDist, PERCENT_RANK() OVER (PARTITION BY Department ORDER BY Rate ) AS PctRank FROM " | 
|---|
| 605 | "HumanResources.vEmployeeDepartmentHistory AS edh INNER JOIN HumanResources.EmployeePayHistory " | 
|---|
| 606 | "AS e ON e.BusinessEntityID = edh.BusinessEntityID WHERE Department IN (N'Information " | 
|---|
| 607 | "Services',N'Document Control') ORDER BY Department, Rate DESC;"); | 
|---|
| 608 | REQUIRE(result->success); | 
|---|
| 609 | REQUIRE(result->types.size() == 5); | 
|---|
| 610 | // TODO ORDER | 
|---|
| 611 | //	REQUIRE( | 
|---|
| 612 | //	    CHECK_COLUMN(result, 0, | 
|---|
| 613 | //	                 {"Document Control", "Document Control", "Document Control", "Document Control", | 
|---|
| 614 | //	                  "Document Control", "Information Services", "Information Services", "Information Services", | 
|---|
| 615 | //	                  "Information Services", "Information Services", "Information Services", "Information | 
|---|
| 616 | // Services", 	                  "Information Services", "Information Services", "Information Services"})); | 
|---|
| 617 | // REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 618 | //	                     {"Arifin", "Norred", "Kharatishvili", "Chai", "Berge", "Trenary", "Conroy", "Ajenstat", | 
|---|
| 619 | //	                      "Wilson", "Sharma", "Connelly", "Berg", "Meyyappan", "Bacon", "Bueno"})); | 
|---|
| 620 | //	REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 621 | //	                     {17.7885, 16.8269, 16.8269, 10.25, 10.25, 50.4808, 39.6635, 38.4615, 38.4615, | 
|---|
| 622 | // 32.4519, 32.4519, 	                      27.4038, 27.4038, 27.4038, 27.4038})); 	REQUIRE(CHECK_COLUMN(result, | 
|---|
| 623 | // 3, {1, 0.8, 0.8, 0.4, 0.4, 1, 0.9, 0.8, 0.8, 0.6, 0.6, 0.4, 0.4, 0.4, 0.4})); 	REQUIRE(CHECK_COLUMN(result, 4, | 
|---|
| 624 | // {1, 0.5, 0.5, 0, 0, 1, 0.888888888888889, 0.666666666666667, 0.666666666666667, 0.444444444444444, | 
|---|
| 625 | // 0.444444444444444, 0, 0, 0, 0})); | 
|---|
| 626 |  | 
|---|
| 627 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql?view=sql-server-2017 | 
|---|
| 628 |  | 
|---|
| 629 | result = con.Query( | 
|---|
| 630 | " SELECT i.ProductID, p.Name, i.LocationID, i.Quantity ,DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY " | 
|---|
| 631 | "i.Quantity DESC) AS Rank FROM Production.ProductInventory AS i INNER JOIN Production.Product AS p ON " | 
|---|
| 632 | "i.ProductID = p.ProductID WHERE i.LocationID BETWEEN 3 AND 4 ORDER BY i.LocationID, Quantity DESC; "); | 
|---|
| 633 | REQUIRE(result->success); | 
|---|
| 634 | REQUIRE(result->types.size() == 5); | 
|---|
| 635 | REQUIRE(CHECK_COLUMN(result, 0, {494, 495, 493, 496, 492, 495, 496, 493, 492, 494})); | 
|---|
| 636 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 637 | { "Paint - Silver", "Paint - Blue", "Paint - Red", "Paint - Yellow", "Paint - Black", | 
|---|
| 638 | "Paint - Blue", "Paint - Yellow", "Paint - Red", "Paint - Black", "Paint - Silver"})); | 
|---|
| 639 | REQUIRE(CHECK_COLUMN(result, 2, {3, 3, 3, 3, 3, 4, 4, 4, 4, 4})); | 
|---|
| 640 | REQUIRE(CHECK_COLUMN(result, 3, {49, 49, 41, 30, 17, 35, 25, 24, 14, 12})); | 
|---|
| 641 | REQUIRE(CHECK_COLUMN(result, 4, {1, 1, 2, 3, 4, 1, 2, 3, 4, 5})); | 
|---|
| 642 |  | 
|---|
| 643 | result = con.Query( " SELECT BusinessEntityID, Rate, DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary " | 
|---|
| 644 | "FROM HumanResources.EmployeePayHistory order by Rate DESC, BusinessEntityID DESC LIMIT 10;"); | 
|---|
| 645 | REQUIRE(result->success); | 
|---|
| 646 | REQUIRE(result->types.size() == 3); | 
|---|
| 647 | REQUIRE( | 
|---|
| 648 | CHECK_COLUMN(result, 0, {1, 25, 273, 2, 234, 263, 7, 234, 287, 285})); // fixed because ambiguity with rank 8 | 
|---|
| 649 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 650 | {125.50, 84.1346, 72.1154, 63.4615, 60.0962, 50.4808, 50.4808, 48.5577, 48.101, 48.101})); | 
|---|
| 651 | REQUIRE(CHECK_COLUMN(result, 2, {1, 2, 3, 4, 5, 6, 6, 7, 8, 8})); | 
|---|
| 652 |  | 
|---|
| 653 | result = con.Query( | 
|---|
| 654 | " SELECT p.FirstName, p.LastName ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS \"Row Number\" ,RANK() OVER " | 
|---|
| 655 | "(ORDER BY a.PostalCode) AS Rank ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS \"Dense Rank\" ,NTILE(4) OVER " | 
|---|
| 656 | "(ORDER BY a.PostalCode) AS Quartile ,s.SalesYTD ,a.PostalCode FROM Sales.SalesPerson AS s INNER JOIN " | 
|---|
| 657 | "Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = " | 
|---|
| 658 | "p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;"); | 
|---|
| 659 | REQUIRE(result->success); | 
|---|
| 660 | REQUIRE(result->types.size() == 8); | 
|---|
| 661 | // TODO order with postal code highly underspec | 
|---|
| 662 |  | 
|---|
| 663 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/ntile-transact-sql?view=sql-server-2017 | 
|---|
| 664 |  | 
|---|
| 665 | result = | 
|---|
| 666 | con.Query( " SELECT p.FirstName, p.LastName ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS Quartile " | 
|---|
| 667 | ",s.SalesYTD AS SalesYTD , a.PostalCode FROM Sales.SalesPerson AS s INNER " | 
|---|
| 668 | "JOIN Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a " | 
|---|
| 669 | "ON a.AddressID = p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; "); | 
|---|
| 670 | REQUIRE(result->success); | 
|---|
| 671 | REQUIRE(result->types.size() == 5); | 
|---|
| 672 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 673 | { "Linda", "Jae", "Michael", "Jillian", "Ranjit", "José", "Shu", "Tsvi", "Rachel", "Tete", | 
|---|
| 674 | "David", "Garrett", "Lynn", "Pamela"})); | 
|---|
| 675 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 676 | { "Mitchell", "Pak", "Blythe", "Carson", "Varkey Chudukatil", "Saraiva", "Ito", "Reiter", | 
|---|
| 677 | "Valdez", "Mensa-Annan", "Campbell", "Vargas", "Tsoflias", "Ansman-Wolfe"})); | 
|---|
| 678 | REQUIRE(CHECK_COLUMN(result, 2, {1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4})); | 
|---|
| 679 | REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 680 | {4251368.55, 4116871.23, 3763178.18, 3189418.37, 3121616.32, 2604540.72, 2458535.62, | 
|---|
| 681 | 2315185.61, 1827066.71, 1576562.20, 1573012.94, 1453719.47, 1421810.92, 1352577.13})); | 
|---|
| 682 | REQUIRE(CHECK_COLUMN(result, 4, | 
|---|
| 683 | { "98027", "98055", "98027", "98027", "98055", "98055", "98055", "98027", "98055", "98055", | 
|---|
| 684 | "98055", "98027", "98055", "98027"})); | 
|---|
| 685 |  | 
|---|
| 686 | result = con.Query( | 
|---|
| 687 | " SELECT p.FirstName, p.LastName ,NTILE(4) OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS " | 
|---|
| 688 | "Quartile ,s.SalesYTD AS SalesYTD ,a.PostalCode FROM Sales.SalesPerson AS s INNER JOIN " | 
|---|
| 689 | "Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = " | 
|---|
| 690 | "p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; "); | 
|---|
| 691 | REQUIRE(result->success); | 
|---|
| 692 | REQUIRE(result->types.size() == 5); | 
|---|
| 693 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 694 | { "Linda", "Michael", "Jillian", "Tsvi", "Garrett", "Pamela", "Jae", "Ranjit", "José", "Shu", | 
|---|
| 695 | "Rachel", "Tete", "David", "Lynn"})); | 
|---|
| 696 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 697 | { "Mitchell", "Blythe", "Carson", "Reiter", "Vargas", "Ansman-Wolfe", "Pak", | 
|---|
| 698 | "Varkey Chudukatil", "Saraiva", "Ito", "Valdez", "Mensa-Annan", "Campbell", "Tsoflias"})); | 
|---|
| 699 | // FIXME something wrong here with NTILE | 
|---|
| 700 | // REQUIRE(CHECK_COLUMN(result, 2, {1, 1, 2, 2, 3, 4, 1, 1, 2, 2, 3, 3, 4, 4})); | 
|---|
| 701 | REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 702 | {4251368.55, 3763178.18, 3189418.37, 2315185.61, 1453719.47, 1352577.13, 4116871.23, | 
|---|
| 703 | 3121616.32, 2604540.72, 2458535.62, 1827066.71, 1576562.20, 1573012.94, 1421810.92})); | 
|---|
| 704 | REQUIRE(CHECK_COLUMN(result, 4, | 
|---|
| 705 | { "98027", "98027", "98027", "98027", "98027", "98027", "98055", "98055", "98055", "98055", | 
|---|
| 706 | "98055", "98055", "98055", "98055"})); | 
|---|
| 707 |  | 
|---|
| 708 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/rank-transact-sql?view=sql-server-2017 | 
|---|
| 709 |  | 
|---|
| 710 | result = | 
|---|
| 711 | con.Query( " SELECT i.ProductID, p.Name, i.LocationID, i.Quantity ,RANK() OVER (PARTITION BY i.LocationID ORDER " | 
|---|
| 712 | "BY i.Quantity DESC) AS Rank FROM Production.ProductInventory AS i INNER JOIN Production.Product AS " | 
|---|
| 713 | "p ON i.ProductID = p.ProductID WHERE i.LocationID BETWEEN 3 AND 4 ORDER BY i.LocationID, i.Quantity " | 
|---|
| 714 | "DESC, i.ProductID; "); | 
|---|
| 715 | REQUIRE(result->success); | 
|---|
| 716 | REQUIRE(result->types.size() == 5); | 
|---|
| 717 | REQUIRE(CHECK_COLUMN(result, 0, {494, 495, 493, 496, 492, 495, 496, 493, 492, 494})); | 
|---|
| 718 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 719 | { "Paint - Silver", "Paint - Blue", "Paint - Red", "Paint - Yellow", "Paint - Black", | 
|---|
| 720 | "Paint - Blue", "Paint - Yellow", "Paint - Red", "Paint - Black", "Paint - Silver"})); | 
|---|
| 721 | REQUIRE(CHECK_COLUMN(result, 2, {3, 3, 3, 3, 3, 4, 4, 4, 4, 4})); | 
|---|
| 722 | REQUIRE(CHECK_COLUMN(result, 3, {49, 49, 41, 30, 17, 35, 25, 24, 14, 12})); | 
|---|
| 723 | REQUIRE(CHECK_COLUMN(result, 4, {1, 1, 3, 4, 5, 1, 2, 3, 4, 5})); | 
|---|
| 724 |  | 
|---|
| 725 | result = con.Query( " SELECT BusinessEntityID, Rate, RANK() OVER (ORDER BY Rate DESC) AS RankBySalary FROM " | 
|---|
| 726 | "HumanResources.EmployeePayHistory AS eph1 WHERE RateChangeDate = (SELECT MAX(RateChangeDate) " | 
|---|
| 727 | "FROM HumanResources.EmployeePayHistory AS eph2 WHERE eph1.BusinessEntityID = " | 
|---|
| 728 | "eph2.BusinessEntityID) ORDER BY BusinessEntityID LIMIT 10;"); | 
|---|
| 729 | REQUIRE(result->success); | 
|---|
| 730 | REQUIRE(result->types.size() == 3); | 
|---|
| 731 | REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})); | 
|---|
| 732 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 733 | {125.50, 63.4615, 43.2692, 29.8462, 32.6923, 32.6923, 50.4808, 40.8654, 40.8654, 42.4808})); | 
|---|
| 734 | // TODO: fix an initialization issue with RANK here | 
|---|
| 735 | //	REQUIRE(CHECK_COLUMN(result, 2, {1, 4, 8, 19, 16, 16, 6, 10, 10, 9})); | 
|---|
| 736 |  | 
|---|
| 737 | // FROM https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017 | 
|---|
| 738 |  | 
|---|
| 739 | result = con.Query( " SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, FirstName, LastName, SalesYTD FROM " | 
|---|
| 740 | "Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;"); | 
|---|
| 741 | REQUIRE(result->success); | 
|---|
| 742 | REQUIRE(result->types.size() == 4); | 
|---|
| 743 | REQUIRE(CHECK_COLUMN(result, 0, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14})); | 
|---|
| 744 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 745 | { "Linda", "Jae", "Michael", "Jillian", "Ranjit", "José", "Shu", "Tsvi", "Rachel", "Tete", | 
|---|
| 746 | "David", "Garrett", "Lynn", "Pamela"})); | 
|---|
| 747 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 748 | { "Mitchell", "Pak", "Blythe", "Carson", "Varkey Chudukatil", "Saraiva", "Ito", "Reiter", | 
|---|
| 749 | "Valdez", "Mensa-Annan", "Campbell", "Vargas", "Tsoflias", "Ansman-Wolfe"})); | 
|---|
| 750 | REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 751 | {4251368.54, 4116871.22, 3763178.17, 3189418.36, 3121616.32, 2604540.71, 2458535.61, | 
|---|
| 752 | 2315185.61, 1827066.71, 1576562.19, 1573012.93, 1453719.46, 1421810.92, 1352577.13})); | 
|---|
| 753 |  | 
|---|
| 754 | result = con.Query( " SELECT FirstName, LastName, TerritoryName,  SalesYTD, ROW_NUMBER() " | 
|---|
| 755 | "OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row FROM Sales.vSalesPerson WHERE " | 
|---|
| 756 | "TerritoryName IS NOT NULL AND SalesYTD <> 0 ORDER BY TerritoryName, SalesYTD DESC;"); | 
|---|
| 757 | REQUIRE(result->success); | 
|---|
| 758 | REQUIRE(result->types.size() == 5); | 
|---|
| 759 | REQUIRE(CHECK_COLUMN(result, 0, | 
|---|
| 760 | { "Lynn", "José", "Garrett", "Jillian", "Ranjit", "Rachel", "Michael", "Tete", "David", | 
|---|
| 761 | "Pamela", "Tsvi", "Linda", "Shu", "Jae"})); | 
|---|
| 762 | REQUIRE(CHECK_COLUMN(result, 1, | 
|---|
| 763 | { "Tsoflias", "Saraiva", "Vargas", "Carson", "Varkey Chudukatil", "Valdez", "Blythe", | 
|---|
| 764 | "Mensa-Annan", "Campbell", "Ansman-Wolfe", "Reiter", "Mitchell", "Ito", "Pak"})); | 
|---|
| 765 | REQUIRE(CHECK_COLUMN(result, 2, | 
|---|
| 766 | { "Australia", "Canada", "Canada", "Central", "France", "Germany", "Northeast", "Northwest", | 
|---|
| 767 | "Northwest", "Northwest", "Southeast", "Southwest", "Southwest", "United Kingdom"})); | 
|---|
| 768 | REQUIRE(CHECK_COLUMN(result, 3, | 
|---|
| 769 | {1421810.92, 2604540.71, 1453719.46, 3189418.36, 3121616.32, 1827066.71, 3763178.17, | 
|---|
| 770 | 1576562.19, 1573012.93, 1352577.13, 2315185.61, 4251368.54, 2458535.61, 4116871.22})); | 
|---|
| 771 | REQUIRE(CHECK_COLUMN(result, 4, {1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1})); | 
|---|
| 772 | } | 
|---|
| 773 |  | 
|---|