GROUP BY column-name problem (need expression)

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • JJA

    GROUP BY column-name problem (need expression)

    Please advise on how to get the GROUP BY coded in an acceptable way:

    DECLARE @LO INT
    DECLARE @HI INT
    DECLARE @StartDate varchar(10)
    DECLARE @EndDate varchar(10)

    SELECT @StartDate = '01/01/2005'
    SELECT @EndDate = '06/30/2005'
    SELECT @LO = 250
    SELECT @HI = 333

    SELECT
    StateCD
    , CountyCD
    , Zip
    , Z.CityName
    , Z.StateCode
    , Z.CountyName
    , 'Criteria' = 'JumboRange:' + Convert(varchar (4),@LO) + '-' +
    Convert(varchar (4),@HI)
    , 'StartingDate' = @StartDate
    , 'ThruDate' = @EndDate
    , JumboAmount = SUM(JumboAmount )
    , JumboMortgages = SUM(JumboMortga ges)
    , JumboFIXMortgag es = SUM(JumboFIXMor tgages)
    , JumboFIXAmount = SUM(JumboFIXAmo unt)
    , JumboARMMortgag es = SUM(JumboARMMor tgages)
    , JumboARMAmount = SUM(JumboARMAmo unt)
    FROM LoanDetails T INNER JOIN dbo.ZipCodesPre ferred Z
    ON T.StateCD = Z.FIPS_State AND T.CountyCD = Z.FIPS_County AND T.Zip =
    Z.ZipCode
    GROUP BY
    StateCD
    , CountyCD
    , Zip
    , Z.CityName
    , Z.StateCode
    , Z.CountyName
    , 'Criteria' = 'JumboRange:' + Convert(varchar (4),@LO) + '-' +
    Convert(varchar (4),@HI)
    , 'StartingDate' = @StartDate
    , 'ThruDate' = @EndDate

  • David Portas

    #2
    Re: GROUP BY column-name problem (need expression)

    You don't need the non-column expressions in the GROUP BY list. Column
    aliases aren't permitted either. Try:

    ....
    GROUP BY statecd, countycd, zip, Z.cityname, Z.statecode, Z.countyname

    --
    David Portas
    SQL Server MVP
    --

    Comment

    • --CELKO--

      #3
      Re: GROUP BY column-name problem (need expression)

      Here is how a SELECT works in SQL ... at least in theory. Real
      products will optimize things, but the code has to produce the same
      results.

      a) Start in the FROM clause and build a working table from all of the
      joins, unions, intersections, and whatever other table constructors are
      there. The <table expression> AS <correlation name> option allows you
      give a name to this working table which you then have to use for the
      rest of the containing query.

      b) Go to the WHERE clause and remove rows that do not pass criteria;
      that is, that do not test to TRUE (i.e. reject UNKNOWN and FALSE). The
      WHERE clause is applied to the working set in the FROM clause.

      c) Go to the optional GROUP BY clause, make groups and reduce each
      group to a single row, replacing the original working table with the
      new grouped table. The rows of a grouped table must be group
      characteristics : (1) a grouping column (2) a statistic about the group
      (i.e. aggregate functions) (3) a function or (4) an expression made up
      those three items.

      d) Go to the optional HAVING clause and apply it against the grouped
      working table; if there was no GROUP BY clause, treat the entire table
      as one group.

      e) Go to the SELECT clause and construct the expressions in the list.
      This means that the scalar subqueries, function calls and expressions
      in the SELECT are done after all the other clauses are done. The
      "AS" operator can also give names to expressions in the SELECT
      list. These new names come into existence all at once, but after the
      WHERE clause, GROUP BY clause and HAVING clause has been executed; you
      cannot use them in the SELECT list or the WHERE clause for that reason.


      If there is a SELECT DISTINCT, then redundant duplicate rows are
      removed. For purposes of defining a duplicate row, NULLs are treated
      as matching (just like in the GROUP BY).

      f) Nested query expressions follow the usual scoping rules you would
      expect from a block structured language like C, Pascal, Algol, etc.
      Namely, the innermost queries can reference columns and tables in the
      queries in which they are contained.

      g) The ORDER BY clause is part of a cursor, not a query. The result
      set is passed to the cursor, which can only see the names in the SELECT
      clause list, and the sorting is done there. The ORDER BY clause cannot
      have expression in it, or references to other columns because the
      result set has been converted into a sequential file structure and that
      is what is being sorted.

      As you can see, things happen "all at once" in SQL, not "from left to
      right" as they would in a sequential file/procedural language model. In
      those languages, these two statements produce different results:
      READ (a, b, c) FROM File_X;
      READ (c, a, b) FROM File_X;

      while these two statements return the same data:

      SELECT a, b, c FROM Table_X;
      SELECT c, a, b FROM Table_X;

      Think about what a confused mess this statement is in the SQL model.

      SELECT f(c2) AS c1, f(c1) AS c2 FROM Foobar;

      That is why such nonsense is illegal syntax.

      Comment

      Working...