Select 来自温度的随机值 table
Select random values from temp table
我在尝试从 SQL 服务器中的临时 table select 随机值时遇到一些问题。
这是临时文件的架构和数据table:
DECLARE @Colours TABLE
(ID TINYINT PRIMARY KEY NOT NULL,
COLOR VARCHAR(30) NOT NULL)
INSERT INTO @Colours
SELECT 0 AS ID, '418CF0' as COLOUR
UNION ALL
SELECT 1, 'FCB441'
UNION ALL
SELECT 2, 'DF3A02'
UNION ALL
SELECT 3, '056492'
UNION ALL
SELECT 4, 'BFBFBF'
UNION ALL
SELECT 5, '1A3B69'
UNION ALL
SELECT 6, 'FFE382'
UNION ALL
SELECT 7, '129CDD'
UNION ALL
SELECT 8, 'CA6B4B'
UNION ALL
SELECT 9, '005CDB'
UNION ALL
SELECT 10, 'F3D288'
UNION ALL
SELECT 11, '506381'
UNION ALL
SELECT 12, 'F1B9A8'
UNION ALL
SELECT 13, 'E0830A'
UNION ALL
SELECT 14, '7893BE'
我想 select 与此查询的每一行的临时 table 不同的 COLOR 值:
SELECT
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
为了更清楚,我举个例子说明我想达到的效果
假设这些是主查询的结果:
+-----------------------------+----------+
| PROVEEDOR | TOTAL |
+-----------------------------+----------+
| GRANJA MARTIN S.R.L. | 5116,34 |
| RUSSAN de Antonio Russo | 705,59 |
| GUACCI EZEQUIEL ADRIAN | 6908,54 |
| RUSSAN de Antonio Russo | 3929,26 |
| ARGON PACK S.R.L | 14716,63 |
| GRANJA MARTIN S.R.L. | 6800,2 |
| CREMAS HELADAS BAIRES SRL | 10564,81 |
| LUSTROL ARGENTINA SRL | 10496,51 |
| DE SANTO S.R.L. | 4210,8 |
| GALLETITAS BELGRANO | 5606,7 |
| RUSSAN de Antonio Russo | 2320,54 |
| UNIVERSAL FISHING S.A | 1608,82 |
| SADELAR S.R.L | 8634,41 |
| DE SANTO S.R.L. | 4210,8 |
| RUSSAN de Antonio Russo | 2820,07 |
| SERVIFRIO S.A. | 1928,57 |
| CREMAS HELADAS BAIRES SRL | 4864,7 |
| ALIMENTOS PUEYRREDON S.R.L. | 15678,67 |
+-----------------------------+----------+
我想得到这样的东西:
+-----------------------------+--------+----------+
| PROVEEDOR | COLOUR | TOTAL |
+-----------------------------+--------+----------+
| GRANJA MARTIN S.R.L. | 418CF0 | 5116,34 |
| RUSSAN de Antonio Russo | FCB441 | 705,59 |
| GUACCI EZEQUIEL ADRIAN | DF3A02 | 6908,54 |
| RUSSAN de Antonio Russo | 56492 | 3929,26 |
| ARGON PACK S.R.L | BFBFBF | 14716,63 |
| GRANJA MARTIN S.R.L. | 1A3B69 | 6800,2 |
| CREMAS HELADAS BAIRES SRL | FFE382 | 10564,81 |
| LUSTROL ARGENTINA SRL | 129CDD | 10496,51 |
| DE SANTO S.R.L. | CA6B4B | 4210,8 |
| GALLETITAS BELGRANO | 005CDB | 5606,7 |
| RUSSAN de Antonio Russo | F3D288 | 2320,54 |
| UNIVERSAL FISHING S.A | 506381 | 1608,82 |
| SADELAR S.R.L | F1B9A8 | 8634,41 |
| DE SANTO S.R.L. | E0830A | 4210,8 |
| RUSSAN de Antonio Russo | 7893BE | 2820,07 |
| SERVIFRIO S.A. | 005CDB | 1928,57 |
| CREMAS HELADAS BAIRES SRL | 129CDD | 4864,7 |
| ALIMENTOS PUEYRREDON S.R.L. | 1A3B69 | 15678,67 |
+-----------------------------+--------+----------+
查询返回的行数是可变的,所以结果集中的颜色是否重复也没有关系。每次我 运行 查询时,我都需要获得与每一行关联的不同颜色(当我提到不同的颜色时,我说的是 selected 的顺序)值。
要从 table 中获取随机行,您可以使用 ORDER BY NEWID()
。对于您的情况,您想使用 CROSS APPLY
:
SELECT
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL,
x.COLOR
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
CROSS APPLY(
SELECT TOP 1 COLOR FROM @Colours ORDER BY NEWID()
)x
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
要进行查询 SARGABLE
,您不应在列上使用函数。而不是使用:
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
您可以使用:
FECHA_EMIS >= CAST('20150701' AS DATE)
AND FECHA_EMIS < CAST('20150801' AS DATE)
编辑:每行随机 COLOR
:
WITH CteQ AS(
SELECT
RN = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)),
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL,
x.COLOR
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
CROSS APPLY(
SELECT TOP 1 COLOR FROM @Colours ORDER BY NEWID()
)x
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
),
CteColours AS(
SELECT *, RN = ROW_NUMBER() OVER(ORDER BY NEWID())
FROM @Colours
)
SELECT
q.PROVEEDOR,
c.COLOR,
q.TOTAL
FROM CteQ q
OUTER APPLY(
SELECT TOP 1 Color
FROM CteColours
WHERE q.RN % RN = 0
ORDER BY NEWID()
)c
我在尝试从 SQL 服务器中的临时 table select 随机值时遇到一些问题。
这是临时文件的架构和数据table:
DECLARE @Colours TABLE
(ID TINYINT PRIMARY KEY NOT NULL,
COLOR VARCHAR(30) NOT NULL)
INSERT INTO @Colours
SELECT 0 AS ID, '418CF0' as COLOUR
UNION ALL
SELECT 1, 'FCB441'
UNION ALL
SELECT 2, 'DF3A02'
UNION ALL
SELECT 3, '056492'
UNION ALL
SELECT 4, 'BFBFBF'
UNION ALL
SELECT 5, '1A3B69'
UNION ALL
SELECT 6, 'FFE382'
UNION ALL
SELECT 7, '129CDD'
UNION ALL
SELECT 8, 'CA6B4B'
UNION ALL
SELECT 9, '005CDB'
UNION ALL
SELECT 10, 'F3D288'
UNION ALL
SELECT 11, '506381'
UNION ALL
SELECT 12, 'F1B9A8'
UNION ALL
SELECT 13, 'E0830A'
UNION ALL
SELECT 14, '7893BE'
我想 select 与此查询的每一行的临时 table 不同的 COLOR 值:
SELECT
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
为了更清楚,我举个例子说明我想达到的效果
假设这些是主查询的结果:
+-----------------------------+----------+
| PROVEEDOR | TOTAL |
+-----------------------------+----------+
| GRANJA MARTIN S.R.L. | 5116,34 |
| RUSSAN de Antonio Russo | 705,59 |
| GUACCI EZEQUIEL ADRIAN | 6908,54 |
| RUSSAN de Antonio Russo | 3929,26 |
| ARGON PACK S.R.L | 14716,63 |
| GRANJA MARTIN S.R.L. | 6800,2 |
| CREMAS HELADAS BAIRES SRL | 10564,81 |
| LUSTROL ARGENTINA SRL | 10496,51 |
| DE SANTO S.R.L. | 4210,8 |
| GALLETITAS BELGRANO | 5606,7 |
| RUSSAN de Antonio Russo | 2320,54 |
| UNIVERSAL FISHING S.A | 1608,82 |
| SADELAR S.R.L | 8634,41 |
| DE SANTO S.R.L. | 4210,8 |
| RUSSAN de Antonio Russo | 2820,07 |
| SERVIFRIO S.A. | 1928,57 |
| CREMAS HELADAS BAIRES SRL | 4864,7 |
| ALIMENTOS PUEYRREDON S.R.L. | 15678,67 |
+-----------------------------+----------+
我想得到这样的东西:
+-----------------------------+--------+----------+
| PROVEEDOR | COLOUR | TOTAL |
+-----------------------------+--------+----------+
| GRANJA MARTIN S.R.L. | 418CF0 | 5116,34 |
| RUSSAN de Antonio Russo | FCB441 | 705,59 |
| GUACCI EZEQUIEL ADRIAN | DF3A02 | 6908,54 |
| RUSSAN de Antonio Russo | 56492 | 3929,26 |
| ARGON PACK S.R.L | BFBFBF | 14716,63 |
| GRANJA MARTIN S.R.L. | 1A3B69 | 6800,2 |
| CREMAS HELADAS BAIRES SRL | FFE382 | 10564,81 |
| LUSTROL ARGENTINA SRL | 129CDD | 10496,51 |
| DE SANTO S.R.L. | CA6B4B | 4210,8 |
| GALLETITAS BELGRANO | 005CDB | 5606,7 |
| RUSSAN de Antonio Russo | F3D288 | 2320,54 |
| UNIVERSAL FISHING S.A | 506381 | 1608,82 |
| SADELAR S.R.L | F1B9A8 | 8634,41 |
| DE SANTO S.R.L. | E0830A | 4210,8 |
| RUSSAN de Antonio Russo | 7893BE | 2820,07 |
| SERVIFRIO S.A. | 005CDB | 1928,57 |
| CREMAS HELADAS BAIRES SRL | 129CDD | 4864,7 |
| ALIMENTOS PUEYRREDON S.R.L. | 1A3B69 | 15678,67 |
+-----------------------------+--------+----------+
查询返回的行数是可变的,所以结果集中的颜色是否重复也没有关系。每次我 运行 查询时,我都需要获得与每一行关联的不同颜色(当我提到不同的颜色时,我说的是 selected 的顺序)值。
要从 table 中获取随机行,您可以使用 ORDER BY NEWID()
。对于您的情况,您想使用 CROSS APPLY
:
SELECT
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL,
x.COLOR
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
CROSS APPLY(
SELECT TOP 1 COLOR FROM @Colours ORDER BY NEWID()
)x
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
要进行查询 SARGABLE
,您不应在列上使用函数。而不是使用:
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
您可以使用:
FECHA_EMIS >= CAST('20150701' AS DATE)
AND FECHA_EMIS < CAST('20150801' AS DATE)
编辑:每行随机 COLOR
:
WITH CteQ AS(
SELECT
RN = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)),
PRV.NOM_PROVEE AS PROVEEDOR,
SUM(IMPORTE_TO) AS TOTAL,
x.COLOR
FROM
FCA_VENTA_HEADER_HIST AS CAB
INNER JOIN
PORTE_MAILLOT_SA.dbo.CPA01 AS PRV
ON PRV.COD_PROVEE COLLATE Modern_Spanish_CI_AS = CAB.COD_PROVEE
CROSS APPLY(
SELECT TOP 1 COLOR FROM @Colours ORDER BY NEWID()
)x
WHERE
YEAR(FECHA_EMIS) = 2015
AND MONTH(FECHA_EMIS) = 7
AND COD_EMPRESA = 1
GROUP BY
PRV.NOM_PROVEE
),
CteColours AS(
SELECT *, RN = ROW_NUMBER() OVER(ORDER BY NEWID())
FROM @Colours
)
SELECT
q.PROVEEDOR,
c.COLOR,
q.TOTAL
FROM CteQ q
OUTER APPLY(
SELECT TOP 1 Color
FROM CteColours
WHERE q.RN % RN = 0
ORDER BY NEWID()
)c