0

この選択をすると、結果としてすべての「わだち」に電話番号が表示されます。私の問題は、各「わだち」にはほぼ 10 の電話番号があり、「わだち」ごとに 3 つの電話番号しか必要ないことです。TOP を使用してみました。しかし、すべてのテーブルの最初の3行のみを表示し、「わだち」による最初の行ではありません。すべてのテーブルではなく、行「わだち」だけにTOPを使用するにはどうすればよいですか

Select Distinct  
t1.rut_cliente as rut_cliente,
t1.nro_fono  as numero 
--Into #tmp_numeros
From dat_clientes_sucursales_contactos_telefonos t1,dat_rut_clientes t2
where  t1.rut_cliente = t2.rut_cliente 
and cod_prioridad = 1

これは私がこのクエリで得たものです:

  Rut_cliente   Nro_fono 
  60506000-5    2046840
  60506000-5    3507935
  60506000-5    4106886
  60506000-5    5440000
  60506000-5    5445000
  81698900-0    2373281
  81698900-0    3541342
  81698900-0    3541438
  81698900-0    3541518
  81698900-0    3542101

これが私が欲しいものです:

  Rut_cliente   Nro_fono 
  60506000-5    2046840
  60506000-5    3507935
  60506000-5    4106886
  81698900-0    2373281
  81698900-0    3541342
  81698900-0    3541438

前もって感謝します。

4

3 に答える 3

7

質問はもともと SQL Server 2008 にタグ付けされていました。ここでは、共通のテーブル式を使用してこれを行うことができます。

;WITH x AS 
 (
   SELECT Rut_cliente, Nro_fono, rn = ROW_NUMBER()
     OVER (PARTITION BY Rut_cliente ORDER BY Nro_fono)
   FROM dbo.dat_clientes_sucursales_contactos_telefonos AS t1
   INNER JOIN dbo.dat_rut_clientes AS t2
   ON t1.rut_cliente = t2.rut_cliente
   WHERE cod_prioridad = 1
)
SELECT Rut_cliente, Nro_fono FROM x
WHERE rn <= 3
ORDER BY Rut_cliente, Nro_fono;

他のコメント:

  • table, table構文を使用しないでください。適切なINNER JOINs を使用します。ここで理由を説明します。
  • 内部クエリに適切なエイリアスを追加して、どの列が t1 から取得され、どの列が t2 から取得されたかがわかるようにしてください。

しかし、ユーザーが実際に SQL Server 2000 を使用していることがわかった。これが機能するかどうかは 100% 確信が持てません (繰り返しますが、どの列がどのテーブルから来ているかを推測しているためです)。

SELECT x.rut_cliente, x.nro_fono, COUNT(*) FROM 
(
  SELECT t1.rut_cliente, t1.nro_fono
    FROM dat_clientes_sucursales_contactos_telefonos AS t1
    INNER JOIN dat_rut_clientes AS t2
    ON t1.rut_cliente = t2.rut_cliente
    WHERE cod_prioridad = 1
) AS x
INNER JOIN dat_clientes_sucursales_contactos_telefonos AS b
ON b.rut_cliente = x.rut_cliente
AND b.nro_fono <= x.nro_fono
GROUP BY x.rut_cliente, x.nro_fono
HAVING COUNT(*) <= 3
ORDER BY x.rut_cliente, x.Nro_fono;
于 2012-07-20T19:38:41.100 に答える
5

たとえば、ROW_NUMBERwhich はウィンドウ関数で、group byによって決定される各パーティション ( と同様)の行番号を返しますorder by

WITH CTE AS(
   SELECT t1.rut_cliente as rut_cliente, t1.nro_fono  as numero,
      RN = ROW_NUMBER()OVER(PARTITION BY Rut_cliente ORDER BY Nro_fono)
   FROM dbo.dat_clientes_sucursales_contactos_telefonos AS t1
   INNER JOIN dbo.dat_rut_clientes AS t2 ON t1.rut_cliente = t2.rut_cliente
   WHERE cod_prioridad = 1
)
SELECT rut_cliente as rut_cliente, nro_fono  as numero
FROM CTE
WHERE RN <= 3
于 2012-07-20T19:38:53.830 に答える
0

これを試して

;with CTE AS (
select Rut_cliente, Nro_fono , ROW_NUMBER() OVER 
(PARTITION BY Rut_cliente ORDER BY Nro_fono) rn
 FROM dbo.dat_clientes_sucursales_contactos_telefonos AS a
INNER JOIN dbo.dat_rut_clientes AS b
ON a.rut_cliente = b.rut_cliente
WHERE cod_prioridad = 1

)
SELECT * FROM CTE where rn <=3
于 2012-07-20T19:39:58.420 に答える