Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- VehicleID Name
- 1 Chuck
- 2 Larry
- LocationID VehicleID City
- 1 1 New York
- 2 1 Seattle
- 3 1 Vancouver
- 4 2 Los Angeles
- 5 2 Houston
- VehicleID Name Locations
- 1 Chuck New York, Seattle, Vancouver
- 2 Larry Los Angeles, Houston
- DECLARE @VehicleID int
- DECLARE @VehicleName varchar(100)
- DECLARE @LocationCity varchar(100)
- DECLARE @Locations varchar(4000)
- DECLARE @Results TABLE
- (
- VehicleID int
- Name varchar(100)
- Locations varchar(4000)
- )
- DECLARE VehiclesCursor CURSOR FOR
- SELECT
- [VehicleID]
- , [Name]
- FROM [Vehicles]
- OPEN VehiclesCursor
- FETCH NEXT FROM VehiclesCursor INTO
- @VehicleID
- , @VehicleName
- WHILE @@FETCH_STATUS = 0
- BEGIN
- SET @Locations = ''
- DECLARE LocationsCursor CURSOR FOR
- SELECT
- [City]
- FROM [Locations]
- WHERE [VehicleID] = @VehicleID
- OPEN LocationsCursor
- FETCH NEXT FROM LocationsCursor INTO
- @LocationCity
- WHILE @@FETCH_STATUS = 0
- BEGIN
- SET @Locations = @Locations + @LocationCity
- FETCH NEXT FROM LocationsCursor INTO
- @LocationCity
- END
- CLOSE LocationsCursor
- DEALLOCATE LocationsCursor
- INSERT INTO @Results (VehicleID, Name, Locations) SELECT @VehicleID, @Name, @Locations
- END
- CLOSE VehiclesCursor
- DEALLOCATE VehiclesCursor
- SELECT * FROM @Results
- SELECT VehicleID
- , Name
- , JOIN(SELECT City FROM Locations WHERE VehicleID = Vehicles.VehicleID, ', ') AS Locations
- FROM Vehicles
- SELECT [VehicleID]
- , [Name]
- , (SELECT CAST(City + ', ' AS VARCHAR(MAX))
- FROM [Location]
- WHERE (VehicleID = Vehicle.VehicleID)
- FOR XML PATH ('')
- ) AS Locations
- FROM [Vehicle]
- DECLARE @EmployeeList varchar(100)
- SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +
- CAST(EmpUniqueID AS varchar(5))
- FROM SalesCallsEmployees
- WHERE SalCal_UniqueID = 1
- CREATE FUNCTION fnConcatVehicleCities(@VehicleId SMALLINT)
- RETURNS VARCHAR(1000) AS
- BEGIN
- DECLARE @csvCities VARCHAR(1000)
- SELECT @csvCities = COALESCE(@csvCities + ', ', '') + COALESCE(City,'')
- FROM Vehicles
- WHERE VehicleId = @VehicleId
- return @csvCities
- END
- -- //Once the User defined function is created then run the below sql
- SELECT VehicleID
- , dbo.fnConcatVehicleCities(VehicleId) AS Locations
- FROM Vehicles
- GROUP BY VehicleID
- stuff(
- (select ',' + Column
- from Table
- inner where inner.Id = outer.Id
- for xml path('')
- ), 1,1,'') as Values
- SELECT [VehicleID]
- , [Name]
- , [Locations] = Isnull( Stuff(
- ( SELECT N', ' + [City] FROM [Locations]
- WHERE VehicleID = a.VehicleID
- FOR XML PATH(''),TYPE ).value('text()[1]', 'nvarchar(max)')
- , 1, 2, N''), N'')
- FROM [Vehicle] a
- SELECT SUM(column)
- SELECT AVG(column)
- SELECT STDEV(column)
- SELECT CONCAT(column, ', ')
- change: this.intermediateResult.Append(value.Value).Append(',');
- to: this.intermediateResult.Append(value.Value);
- change: output = this.intermediateResult.ToString(0, this.intermediateResult.Length - 1);
- to: output = this.intermediateResult.ToString();
- SELECT dbo.CONCATENATE(column1 + '|') from table1
- -- rank locations by incrementing lexicographical order
- WITH RankedLocations AS (
- SELECT
- VehicleID,
- City,
- ROW_NUMBER() OVER (
- PARTITION BY VehicleID
- ORDER BY City
- ) Rank
- FROM
- Locations
- ),
- -- concatenate locations using a recursive query
- -- (Common Table Expression)
- Concatenations AS (
- -- for each vehicle, select the first location
- SELECT
- VehicleID,
- CONVERT(nvarchar(MAX), City) Cities,
- Rank
- FROM
- RankedLocations
- WHERE
- Rank = 1
- -- then incrementally concatenate with the next location
- -- this will return intermediate concatenations that will be
- -- filtered out later on
- UNION ALL
- SELECT
- c.VehicleID,
- (c.Cities + ', ' + l.City) Cities,
- l.Rank
- FROM
- Concatenations c -- this is a recursion!
- INNER JOIN RankedLocations l ON
- l.VehicleID = c.VehicleID
- AND l.Rank = c.Rank + 1
- ),
- -- rank concatenation results by decrementing length
- -- (rank 1 will always be for the longest concatenation)
- RankedConcatenations AS (
- SELECT
- VehicleID,
- Cities,
- ROW_NUMBER() OVER (
- PARTITION BY VehicleID
- ORDER BY Rank DESC
- ) Rank
- FROM
- Concatenations
- )
- -- main query
- SELECT
- v.VehicleID,
- v.Name,
- c.Cities
- FROM
- Vehicles v
- INNER JOIN RankedConcatenations c ON
- c.VehicleID = v.VehicleID
- AND c.Rank = 1
- using System;
- using System.Data;
- using System.Data.SqlClient;
- using System.Data.SqlTypes;
- using System.Text;
- using Microsoft.SqlServer.Server;
- [Serializable]
- [Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize=8000)]
- public class CSV:IBinarySerialize
- {
- private StringBuilder Result;
- public void Init() {
- this.Result = new StringBuilder();
- }
- public void Accumulate(SqlString Value) {
- if (Value.IsNull) return;
- this.Result.Append(Value.Value).Append(",");
- }
- public void Merge(CSV Group) {
- this.Result.Append(Group.Result);
- }
- public SqlString Terminate() {
- return new SqlString(this.Result.ToString());
- }
- public void Read(System.IO.BinaryReader r) {
- this.Result = new StringBuilder(r.ReadString());
- }
- public void Write(System.IO.BinaryWriter w) {
- w.Write(this.Result.ToString());
- }
- }
- CREATE FUNCTION [dbo].[JoinTexts]
- (
- @delimiter VARCHAR(20) ,
- @whereClause VARCHAR(1)
- )
- RETURNS VARCHAR(MAX)
- AS
- BEGIN
- DECLARE @Texts VARCHAR(MAX)
- SELECT @Texts = COALESCE(@Texts + @delimiter, '') + T.Texto
- FROM SomeTable AS T
- WHERE T.SomeOtherColumn = @whereClause
- RETURN @Texts
- END
- GO
- SELECT dbo.JoinTexts(' , ', 'Y')
Add Comment
Please, Sign In to add comment