Reputation: 43
So I have the following table for example
|Company Name | Weight | Date |Unique ID|
|:------------|:-------|:-----|:--------|
|ABC |22 |10-3 |1 |
|ABC |22 |10-3 |2 |
|DEF |50 |10-3 |3 |
|DEF |50 |10-3 |4 |
I need the SELECT statement to show groups only if the SUM(WEIGHT) for that group is >=100.
So the output should be:
|Company Name | Weight | Date |Unique ID|
|:------------|:-------|:-----|:--------|
|ABC |22 |10-3 |1 |
|ABC |22 |10-3 |2 |
|DEF |100 |10-3 |GROUP |
Currently, I am trying the following, but receiving an Invalid use of Group
SELECT COMPANY_NAME, DATE,
(CASE WHEN SUM(WEIGHT) >= 100 THEN 'GROUP' ELSE UNIQUE_ID END) AS
GROUP_CRITERIA
FROM TABLE GROUP BY COMPANY_NAME, DATE,
(CASE WHEN SUM(WEIGHT) >= 100 THEN 'GROUP' ELSE UNIQUE_ID END);
Upvotes: 1
Views: 107
Reputation: 127
Here's a way: (Max(date) as you didn't mentioned how you were doing it for groups)
SELECT COMPANY_NAME, DATE, WEIGHT, UNIQUE_ID
FROM TABLE
WHERE COMPANY_NAME in
( SELECT COMPANY_NAME FROM
(SELECT COMPANY_NAME, SUM(WEIGHT) FROM TABLE GROUP BY COMPANY_NAME
HAVING SUM(WEIGHT) < 100) u)
UNION
SELECT COMPANY_NAME, MAX(DATE), SUM(WEIGHT), 'GROUP'
FROM TABLE
WHERE COMPANY_NAME not in
( SELECT COMPANY_NAME FROM (SELECT COMPANY_NAME, SUM(WEIGHT) FROM TABLE GROUP BY COMPANY_NAME
HAVING SUM(WEIGHT) < 100) u)
GROUP BY COMPANY_NAME
Upvotes: 0
Reputation: 614
I'm thinking something like this:
SELECT DISTINCT T1.company_name, IFNULL(T2.weight, T1.weight) AS weight, IFNULL(T2.date, T1.date) AS "date", IF(T2.company_name IS NULL, T1.unique_id, T2.unique_id)
FROM table T1
LEFT OUTER JOIN (
SELECT company_name, `date`, SUM(weight) AS weight
FROM table
GROUP BY company_name
HAVING SUM(weight) >= 100) T2 ON T2.company_name = T1.company_name
Upvotes: 0
Reputation: 562611
It appears that you mean you want groups that have sum(weight) < 100 should be included into a single group.
To do this, I'd do the first GROUP BY in a derived table subquery, then I can reference that sum in expressions of the outer query:
SELECT
CASE WHEN TOTAL_WEIGHT >= 100 THEN COMPANY_NAME ELSE 'GROUP' END AS COMPANY_NAME,
DATE,
SUM(TOTAL_WEIGHT) AS TOTAL_WEIGHT
FROM (
SELECT COMPANY_NAME, DATE, SUM(WEIGHT) AS TOTAL_WEIGHT
FROM MyTable
GROUP BY COMPANY_NAME, DATE
) AS T
GROUP BY COMPANY_NAME, DATE;
Upvotes: 1