SELECT predicate WHERE and HAVING
1. Categories with Diverse Product Pricing and Specific Stock Levels
SQL Server Query 1
SELECT
C.CategoryName,
MAX(P.UnitPrice) AS MaxUnitPrice,
MIN(P.UnitPrice) AS MinUnitPrice,
SUM(CASE WHEN P.Discontinued = 1 THEN P.UnitsInStock ELSE 0 END) AS TotalDiscontinuedUnits
FROM Categories C
JOIN Products P ON C.CategoryID = P.CategoryID
GROUP BY C.CategoryName
HAVING
(MAX(P.UnitPrice) - MIN(P.UnitPrice)) > 50 -- Price range diversity
AND
SUM(CASE WHEN P.Discontinued = 1 THEN P.UnitsInStock ELSE 0 END) < 10; -- Low stock of discontinued items
Create SQL query with SqlQueryBuilder 1
var (sql1, parameters1) = new SqlQueryBuilder()
.Select()
.Column("c.CategoryName")
.Column(new MAX(new Column("P.UnitPrice")), "MaxUnitPrice")
.Column(new MIN(new Column("P.UnitPrice")), "MinUnitPrice")
.Column(new SUM(new CASE()
.When(new Column("P.Discontinued").Equale(1)).Then(new Column("P.UnitsInStock")).Else(0)), "TotalDiscontinuedUnits")
.From("Categories", "C")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Products", "P")
.On(new Column("C.CategoryID").Equale(new Column("P.CategoryID")))
})
.GroupBy(new GroupBy("C.CategoryName"))
.Having(new Having(
new ColumnArithmatic().StartBracket(new MAX(new Column("P.UnitPrice")))
.SUBTRACT(new MIN(new Column("P.UnitPrice"))).EndBracket().GreaterThan(50)
.AND(new SUM(new CASE()
.When(new Column("P.Discontinued").Equale(1)).Then(new Column("P.UnitsInStock")).Else(0)
).LessThan(10))
))
.Build();
Query build by SqlQueryBuilder 1
SELECT c.CategoryName,
MAX(P.UnitPrice) AS MaxUnitPrice,
MIN(P.UnitPrice) AS MinUnitPrice,
SUM(CASE WHEN P.Discontinued = @pMAIN_2507200206539624510 THEN P.UnitsInStock ELSE @pMAIN_2507200206539624511 END) AS TotalDiscontinuedUnits
FROM Categories AS C
INNER JOIN
Products AS P
ON C.CategoryID = P.CategoryID
GROUP BY C.CategoryName
HAVING (MAX(P.UnitPrice) - MIN(P.UnitPrice)) > @pMAIN_2507200206539624512
AND SUM(CASE WHEN P.Discontinued = @pMAIN_2507200206539624513 THEN P.UnitsInStock ELSE @pMAIN_2507200206539624514 END) < @pMAIN_2507200206539624515;
Parameters (If used)
Name |
Value |
@pMAIN_2507200206539624510 |
1 |
@pMAIN_2507200206539624511 |
0 |
@pMAIN_2507200206539624512 |
50 |
@pMAIN_2507200206539624513 |
1 |
@pMAIN_2507200206539624514 |
0 |
@pMAIN_2507200206539624515 |
10 |
Query Results 1:
|
CategoryName |
MaxUnitPrice |
MinUnitPrice |
TotalDiscontinuedUnits |
1 |
Confections
|
81.0000
|
9.2000
|
0
|
2 |
Dairy Products
|
55.0000
|
2.5000
|
0
|
3 |
Seafood
|
62.5000
|
6.0000
|
0
|
2. Customers with High-Value Orders AND Consistent Ordering Patterns
SQL Server Query 2
SELECT
C.CompanyName AS CustomerName,
COUNT(DISTINCT O.OrderID) AS NumberOfOrders,
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) AS TotalOrderValue,
COUNT(DISTINCT YEAR(O.OrderDate)) AS DistinctOrderYears
FROM Customers C
JOIN Orders O ON C.CustomerID = O.CustomerID
JOIN [Order Details] OD ON O.OrderID = OD.OrderID
GROUP BY C.CompanyName
HAVING
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) > 100000 -- High total order value
AND
COUNT(DISTINCT YEAR(O.OrderDate)) >= 3; -- Ordered in at least 3 different years
Create SQL query with SqlQueryBuilder 2
var (sql2, parameters2) = new SqlQueryBuilder()
.Select()
.Column("C.CompanyName", "CustomerName")
.Column(new COUNT(new Column("O.OrderID"), true), "NumberOfOrders")
.Column(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()), "TotalOrderValue")
.Column(new COUNT(new YEAR(new Column("O.OrderDate")), true), "DistinctOrderYears")
.From("Customers", "C")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Orders", "O")
.On(new Column("C.CustomerID").Equale(new Column("O.CustomerID"))),
new INNERJOIN().TableName("[Order Details]", "OD")
.On(new Column("O.OrderID").Equale(new Column("OD.OrderID")))
})
.GroupBy(new GroupBy("C.CompanyName"))
.Having(new Having(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()).GreaterThan(100000)
.AND(new COUNT(new YEAR(new Column("O.OrderDate")), true).GreaterThanOrEqualeTo(3))
))
.Build();
Query build by SqlQueryBuilder 2
SELECT C.CompanyName AS CustomerName,
COUNT(DISTINCT O.OrderID) AS NumberOfOrders,
SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507200206539798580 - OD.Discount)) AS TotalOrderValue,
COUNT(DISTINCT YEAR(O.OrderDate)) AS DistinctOrderYears
FROM Customers AS C
INNER JOIN
Orders AS O
ON C.CustomerID = O.CustomerID
INNER JOIN
[Order Details] AS OD
ON O.OrderID = OD.OrderID
GROUP BY C.CompanyName
HAVING SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507200206539798581 - OD.Discount)) > @pMAIN_2507200206539798582
AND COUNT(DISTINCT YEAR(O.OrderDate)) >= @pMAIN_2507200206539798583;
Parameters (If used)
Name |
Value |
@pMAIN_2507200206539798580 |
1 |
@pMAIN_2507200206539798581 |
1 |
@pMAIN_2507200206539798582 |
100000 |
@pMAIN_2507200206539798583 |
3 |
Query Results 2:
|
CustomerName |
NumberOfOrders |
TotalOrderValue |
DistinctOrderYears |
1 |
Ernst Handel
|
30
|
104874.978713989
|
3
|
2 |
QUICK-Stop
|
28
|
110277.304977417
|
3
|
3 |
Save-a-lot Markets
|
31
|
104361.949920654
|
3
|
3. Suppliers with Products in Multiple Categories AND High Reorder Activity
SQL Server Query 3
SELECT
S.CompanyName AS SupplierName,
COUNT(DISTINCT C.CategoryID) AS DistinctCategoriesSupplied,
SUM(CASE WHEN P.ReorderLevel > 5 THEN P.UnitsOnOrder ELSE 0 END) AS TotalHighReorderUnitsOnOrder
FROM Suppliers S
JOIN Products P ON S.SupplierID = P.SupplierID
JOIN Categories C ON P.CategoryID = C.CategoryID
GROUP BY S.CompanyName
HAVING
COUNT(DISTINCT C.CategoryID) >= 2 -- Products in at least 2 categories
AND
SUM(CASE WHEN P.ReorderLevel > 5 THEN P.UnitsOnOrder ELSE 0 END) >= 100; -- High units on order for reorderable items
Create SQL query with SqlQueryBuilder 3
var (sql3, parameters3) = new SqlQueryBuilder()
.Select()
.Column("S.CompanyName", "SupplierName")
.Column(new COUNT(new Column("C.CategoryID"), true), "DistinctCategoriesSupplied")
.Column(new SUM(new CASE()
.When(new Column("P.ReorderLevel").GreaterThan(5)).Then(new Column("P.UnitsOnOrder")).Else(0)), "TotalHighReorderUnitsOnOrder")
.From("Suppliers", "S")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Products", "P")
.On(new Column("S.SupplierID").Equale(new Column("P.SupplierID"))),
new INNERJOIN().TableName("Categories", "C")
.On(new Column("P.CategoryID").Equale(new Column("C.CategoryID")))
})
.GroupBy(new GroupBy("S.CompanyName"))
.Having(new Having(new COUNT(new Column("C.CategoryID"), true).GreaterThanOrEqualeTo(2))
.AND(new SUM(
new CASE()
.When(new Column("P.ReorderLevel").GreaterThan(5)).Then(new Column("P.UnitsOnOrder")).Else(0)
).GreaterThanOrEqualeTo(100)))
.Build();
Query build by SqlQueryBuilder 3
SELECT S.CompanyName AS SupplierName,
COUNT(DISTINCT C.CategoryID) AS DistinctCategoriesSupplied,
SUM(CASE WHEN P.ReorderLevel > @pMAIN_2507200206540274900 THEN P.UnitsOnOrder ELSE @pMAIN_2507200206540274901 END) AS TotalHighReorderUnitsOnOrder
FROM Suppliers AS S
INNER JOIN
Products AS P
ON S.SupplierID = P.SupplierID
INNER JOIN
Categories AS C
ON P.CategoryID = C.CategoryID
GROUP BY S.CompanyName
HAVING COUNT(DISTINCT C.CategoryID) >= @pMAIN_2507200206540274902
AND SUM(CASE WHEN P.ReorderLevel > @pMAIN_2507200206540274903 THEN P.UnitsOnOrder ELSE @pMAIN_2507200206540274904 END) >= @pMAIN_2507200206540274905;
Parameters (If used)
Name |
Value |
@pMAIN_2507200206540274900 |
5 |
@pMAIN_2507200206540274901 |
0 |
@pMAIN_2507200206540274902 |
2 |
@pMAIN_2507200206540274903 |
5 |
@pMAIN_2507200206540274904 |
0 |
@pMAIN_2507200206540274905 |
100 |
Query Results 3:
|
SupplierName |
DistinctCategoriesSupplied |
TotalHighReorderUnitsOnOrder |
1 |
Exotic Liquids
|
2
|
110
|
4. Products with Significant Order Volume and Average Discount Above a Threshold
SQL Server Query 4
SELECT
P.ProductName,
COUNT(OD.OrderID) AS TotalOrderDetailsEntries, -- How many times this product appeared in an order
AVG(OD.Discount) AS AverageDiscountForProduct
FROM Products P
JOIN [Order Details] OD ON P.ProductID = OD.ProductID
GROUP BY P.ProductName
HAVING
COUNT(OD.OrderID) >= 50 -- Product has high order volume
AND
AVG(OD.Discount) > (SELECT AVG(Discount) FROM [Order Details]); -- Product's average discount is higher than overall average
Create SQL query with SqlQueryBuilder 4
var (sql4, parameters4) = new SqlQueryBuilder()
.Select()
.Column("P.ProductName")
.Column(new COUNT(new Column("OD.OrderID")),"TotalOrderDetailsEntries")
.Column(new AVG(new Column("OD.Discount")), "AverageDiscountForProduct")
.From("Products", "P")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("[Order Details]","OD")
.On(new Column("P.ProductID").Equale(new Column("OD.ProductID")))
})
.GroupBy(new GroupBy("P.ProductName"))
.Having(new Having(new COUNT(new Column("OD.OrderID")).GreaterThanOrEqualeTo(50))
.AND(new AVG(new Column("OD.Discount")).GreaterThan(new SqlQueryBuilder().Select()
.Column(new AVG(new Column("Discount"))).From("[Order Details]"))))
.Build();
Query build by SqlQueryBuilder 4
SELECT P.ProductName,
COUNT(OD.OrderID) AS TotalOrderDetailsEntries,
AVG(OD.Discount) AS AverageDiscountForProduct
FROM Products AS P
INNER JOIN
[Order Details] AS OD
ON P.ProductID = OD.ProductID
GROUP BY P.ProductName
HAVING COUNT(OD.OrderID) >= @pMAIN_2507200206540378590
AND AVG(OD.Discount) > (SELECT AVG(Discount)
FROM [Order Details]);
Parameters (If used)
Name |
Value |
@pMAIN_2507200206540378590 |
50 |
Query Results 4:
|
ProductName |
TotalOrderDetailsEntries |
AverageDiscountForProduct |
1 |
Camembert Pierrot
|
51
|
0.0639215695361296
|
2 |
Gnocchi di nonna Alice
|
50
|
0.0620000009983778
|
3 |
Gorgonzola Telino
|
51
|
0.0627450989741905
|
4 |
Guaraná Fantástica
|
51
|
0.0568627458723152
|